Skip to content

投稿

依存性注入はPythonプログラマーをより優れたものにできるか?

2025年2月16日 • 6 分で読める

依存性注入はPythonプログラマーをより優れたものにできるか?

依存性注入は静的言語の主流ですが、Pythonで使用することは理にかなっているでしょうか?それはPythonプログラマーをより優れたものにするでしょうか?

そして、待ってください、依存性注入とは何でしたっけ?

まず、質問に答えましょう:依存性注入(DI)とは何か?

依存性注入は、使用する際にオブジェクトの構築をクラスの外に移動するパターンです。代わりに、クラスは抽象化に依存します。

C#やJavaなどの静的言語では、依存性注入は結合度を減らし、テストを容易にするために広く使用されています。実際、依存性注入フレームワークは、依存関係とそれらの相互関係を維持することを唯一の目的としています。

依存性注入は2つの主な目的を果たします:

まず、抽象化に依存することで複雑さを軽減します。

次に、抽象化に依存することで、テスト用のモックを含む異なる実装をクラスまたは関数に渡すことができます。

コードで説明しましょう:

# Before 
class User:
    def __init__(self):
        self.database = SqlServerDatabase()

    def get_details(self, user_id: int):
        self.database.get_user_details(user_id)

# After  
class User:
    def __init__(self, database: Database):
        self.database = database

    def get_details(self, user_id: int):
        self.database.get_user_details(user_id)

これは最も単純な形式での依存性注入です。概念は単純ですが、その力は柔軟な設計を可能にすることにあります。

Beforeの例では、UserクラスはSqlServerDatabaseクラスに密結合しています。Userクラスをテストしたい場合、新しいSqlServerDatabaseインスタンスを作成する必要があります。

Afterの例では、UserクラスはDatabase抽象化に疎結合しています。Database抽象化の異なる実装をUserクラスに渡すことができます。

異なるデータベース実装間で切り替える方法を示す実践的な例でこの柔軟性を説明しましょう:

date_string = "2023-10-01"  # Example date string
date_format = "%Y-%m-%d"    # Input string format
birthday = datetime.strptime(date_string, date_format) 
turn_of_the_century = datetime.strptime('2000-01-01', date_format)

database = PostgresDatabase("")

if birthday < turn_of_the_century:
    database = SqlServerDatabase("")

user = User(database=database)
user.get_details(user_id=1)

6行目(birthday < turn_of_the_century)では、依存性注入により、異なる条件に基づいて実装を簡単に切り替えることができます。この柔軟性は本番コードにとって価値がありますが、依存性注入の最も一般的な用途の1つ、特に静的言語では、テストです。

例を示します:

class UserTests(unittest.TestCase):
    def test_is_authenticated(self):
        database = MockDatabase('connection_string')
        
        is_authenticated = User(database).is_authenticated('user', 'pass')

        self.assertTrue(is_authenticated)

これはMockDatabaseクラスを使用した単純な例です。Pythonでは、組み込みのMockクラスを使用して同じ結果を達成することもできます。

興味深いことに、私が取り組んだPythonプロジェクトでは依存性注入は広く使用されていませんでした。静的言語の背景から来た私は、驚きました。そして、それは直感に反しているように見えました。

しかし、この採用が限定的である理由があります。Pythonの組み込みパッチ機能は既に優れたテスト機能を提供しており、依存性注入の主な利点の1つを排除しています。依存性注入は複雑さを軽減するのに役立つ可能性がありますが、Pythonには同じ目標を達成するための他のアプローチがあります。

依存性注入をPythonで使用すべきではないと言っているわけではありません。むしろ、すべてのツールとパターンと同様に、それらを使用する場所と時間があります。そして、依存性注入はあなたのツールベルト内のもう1つのツールであり、コードの品質を向上させます。

ほとんどのPythonプロジェクトでは、依存性注入は一般的にコード品質を向上させると思います。

依存性注入についてさらに詳しく知りたい場合は、2つの一般的なPythonフレームワークをチェックすることをお勧めします:

  • Injector (github.com/python-injector/injector)
  • Dependency Injector (python-dependency-injector.ets-labs.org)

Author: Chuck Conway is an AI Engineer with nearly 30 years of software engineering experience. He builds practical AI systems—content pipelines, infrastructure agents, and tools that solve real problems—and shares what he’s learning along the way. Connect with him on social media: X (@chuckconway) or visit him on YouTube and on SubStack.

著者: Chuck Conwayは、ソフトウェアエンジニアリングの経験が30年近くあるAIエンジニアです。彼は実用的なAIシステム(コンテンツパイプライン、インフラストラクチャエージェント、実際の問題を解決するツール)を構築し、学んだことを共有しています。ソーシャルメディアで彼とつながってください: X (@chuckconway) または YouTubeSubStack で彼を訪問してください。

↑ トップに戻る

こちらもおすすめ