Beiträge
Kann Dependency Injection mich zu einem besseren Python-Programmierer machen?
16. Februar 2025 • 3 min Lesezeit
Dependency Injection ist ein Grundpfeiler in statischen Sprachen, aber macht es Sinn, es in Python zu verwenden? Wird es mich zu einem besseren Python-Programmierer machen?
Und warte, was ist Dependency Injection nochmal?
Zunächst beantworten wir die Frage: Was ist Dependency Injection (DI)?
Dependency Injection ist ein Muster, das, wenn verwendet, die Konstruktion eines Objekts aus der Klasse herausnimmt. Stattdessen nimmt die Klasse eine Abhängigkeit von einer Abstraktion an.
In statischen Sprachen wie C# und Java wird Dependency Injection intensiv genutzt, um Kopplung zu reduzieren und Tests zu erleichtern. Tatsächlich finden Sie Dependency-Injection-Frameworks, deren einziger Zweck darin besteht, Abhängigkeiten und ihre Beziehungen zueinander zu verwalten.
Dependency Injection dient zwei Hauptzwecken:
Erstens reduziert es die Komplexität, indem es eine Abhängigkeit von einer Abstraktion übernimmt.
Zweitens ermöglicht die Abhängigkeit von einer Abstraktion, dass verschiedene Implementierungen, einschließlich Mocks zum Testen, in die Klasse oder Funktion übergeben werden.
Lassen Sie mich das mit etwas Code demonstrieren:
# 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)
Dies ist Dependency Injection in seiner einfachsten Form. Während das Konzept unkompliziert ist, liegt seine Kraft darin, flexible Designs zu ermöglichen.
Im Before-Beispiel ist die User-Klasse eng an die SqlServerDatabase-Klasse gekoppelt. Wenn wir die User-Klasse testen möchten, müssen wir eine neue SqlServerDatabase-Instanz erstellen.
Im After-Beispiel ist die User-Klasse lose an die Database-Abstraktion gekoppelt. Wir können eine andere Implementierung der Database-Abstraktion an die User-Klasse übergeben.
Lassen Sie mich diese Flexibilität mit einem praktischen Beispiel demonstrieren, das zeigt, wie wir zwischen verschiedenen Datenbankimplementierungen wechseln können:
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)
In Zeile 6 (birthday < turn_of_the_century) ermöglicht Dependency Injection es uns, Implementierungen basierend auf verschiedenen Bedingungen leicht auszutauschen. Während diese Flexibilität für Produktionscode wertvoll ist, ist einer der häufigsten Verwendungszwecke für Dependency Injection, besonders in statischen Sprachen, das Testen.
Hier ist ein Beispiel:
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)
Dies ist ein einfaches Beispiel mit einer MockDatabase-Klasse. In Python könnten wir auch die integrierte Mock-Klasse verwenden, um das gleiche Ergebnis zu erreichen.
Interessanterweise wurde Dependency Injection in den Python-Projekten, an denen ich gearbeitet habe, nicht weit verbreitet verwendet. Mit meinem Hintergrund in statischen Sprachen war ich überrascht – und es schien kontraintuiv.
Es gibt jedoch einen Grund für diese begrenzte Akzeptanz. Die integrierte Patch-Funktionalität von Python bietet bereits hervorragende Testfähigkeiten und eliminiert einen der Hauptvorteile von Dependency Injection. Während Dependency Injection immer noch zur Reduzierung der Komplexität beitragen kann, hat Python andere Ansätze, um das gleiche Ziel zu erreichen.
Ich sage nicht, dass Dependency Injection nicht in Python verwendet werden sollte. Ganz im Gegenteil, wie alle Tools und Muster gibt es einen Platz und eine Zeit, um sie zu verwenden. Und Dependency Injection ist nur ein weiteres Werkzeug in Ihrem Werkzeugkasten, das die Qualität Ihres Codes verbessert.
Ich denke, dass Dependency Injection die Codequalität in den meisten Python-Projekten generell erhöhen würde.
Wenn Sie sich weiter mit Dependency Injection befassen möchten, empfehle ich Ihnen, zwei beliebte Python-Frameworks zu erkunden:
- Injector (github.com/python-injector/injector)
- Dependency Injector (python-dependency-injector.ets-labs.org)
Autor: Chuck Conway ist ein KI-Ingenieur mit fast 30 Jahren Erfahrung in der Softwareentwicklung. Er entwickelt praktische KI-Systeme – Content-Pipelines, Infrastruktur-Agenten und Tools, die echte Probleme lösen – und teilt seine Erkenntnisse unterwegs. Verbinden Sie sich mit ihm in den sozialen Medien: X (@chuckconway) oder besuchen Sie ihn auf YouTube und auf SubStack.