@ Dan Antwort ist sehr durch, sondern nur auf die Diskussion hinzuzufügen:
Ich bin ein großer Fan von Dekorateuren, um Boilerplate Code aus Funktionen zu entfernen.
Während es sehr einfach ist, die Abhängigkeit als einen anderen Parameter zu nehmen, fügt sie irrelevanten Code hinzu, um zu garantieren, dass alle Abhängigkeiten in den meisten Kontexten initialisiert werden.
sagte, dass ich ein Modul behaupten, dass zu handhaben: Injectable, die 3 eine @autowired
Dekorateur für Python bietet Injektion einfache und saubere Abhängigkeit zu aktivieren:
- die Funktion muss nicht der autowiring bewusst sein, auf allen
- Abhängigkeiten können faul sein
- initialisiert der Anrufer in der Lage, die Abhängigkeits Instanzen explizit übergeben, wenn
gewünscht
Der ganze Sinn des Dekorateur ist wiederum Code wie diese:
def __init__(self, *, model: Model = None, service: Service = None):
if model is None:
model = Model()
if service is None:
service = Service()
self.model = model
self.service = service
# actual code
in diese:
@autowired
def __init__(self, *, model: Model, service: Service):
self.model = model
self.service = service
# actual code
Keine komplexen Sachen, kein Setup, keine Workflows erzwungen. Und jetzt ist Ihr Funktionscode nicht mehr mit Abhängigkeits-Initialisierungscode überladen.
Der Decorator Ansatz ist sehr minimalistisch. Es kann sein, dass ein vollwertiger Rahmen besser zu Ihnen passt. Dafür gibt es hervorragende Module wie Injector.
+1. Achten Sie nur auf falsche Werte, wenn Sie 'self._engine = engine oder Something()' ausführen, und prüfen Sie lieber auf None. Ich habe solche Funktionalität in einen sehr direkten @ injectable Decorator für Python 3 eingepackt, um saubereren Code zu erhalten: https://github.com/allrod5/injectable –