Was ist ein pythonischer Weg für Dependency Injection?

Einführung

Für Java, Dependency Injection funktioniert als Reine OOP, d.h. Sie bieten eine Schnittstelle implementiert werden und in deine framework-code akzeptiert eine Instanz einer Klasse, die die definierte Schnittstelle.

Nun für Python, Sie sind in der Lage, das gleiche zu tun, aber ich glaube, die Methode war zu viel Aufwand Recht vor, im Falle von Python. Also wie würde dann implementieren Sie es in der Pythonic way?

Anwendungsfall

Sagen, das ist die framework-code:

class FrameworkClass():
    def __init__(self, ...):
        ...

    def do_the_job(self, ...):
        # some stuff
        # depending on some external function

Der Grundlegende Ansatz

Den meisten naiv (und vielleicht die beste?) Weg ist zu verlangen, um die externe Funktion bereitgestellt werden, die in der FrameworkClass Konstruktor, und dann aufgerufen werden, aus der do_the_job Methode.

Framework-Code:

class FrameworkClass():
    def __init__(self, func):
        self.func = func

    def do_the_job(self, ...):
        # some stuff
        self.func(...)

Client-Code:

def my_func():
    # my implementation

framework_instance = FrameworkClass(my_func)
framework_instance.do_the_job(...)

Frage

Die Frage ist kurz. Gibt es eine bessere häufigsten verwendeten Pythonic Weg, dies zu tun? Oder vielleicht irgendwelche Bibliotheken die Unterstützung solcher Funktionalität?

UPDATE: die Konkrete Situation

Vorstellen, ich entwickle eine Mikro-web-framework übernimmt die Authentifizierung mittels Token. Dieser Rahmen muss eine Funktion bereitstellen ID aus den erhaltenen token und dem Benutzer entsprechend, dass ID.

Offensichtlich, Rahmen weiß nichts über die Benutzer oder anderen Anwendungen, die spezifische Logik, so dass der client-code muss injizieren der Benutzer get-Funktionalität in das framework, um die Authentifizierung arbeiten.

Kommentar zu dem Problem
Warum nimmst du nicht "ein interface, das implementiert werden und in deine framework-code akzeptiert eine Instanz einer Klasse, die die definierte Schnittstelle"? In Python würde man dies in einem EAFP Stil (d.h. davon ausgehen, daß es sich trifft, dass-Schnittstelle und eine AttributeError oder TypeError ausgelöst wird, sonst), aber ansonsten ist es das gleiche. Kommentarautor: jonrsharpe
Es ist einfach zu tun, dass die Verwendung von abs's ABCMeta Metaklasse mit @abstractmethod decorator, und es ist keine manuelle überprüfung. Wollen einfach nur einige Möglichkeiten und Anregungen. Die, die Sie zitiert, ist die sauber, ist aber denke ich mit mehr Aufwand. Kommentarautor: bagrat
Dann weiß ich nicht, auf welche Frage versuchen Sie zu Fragen. Kommentarautor: jonrsharpe
Ok, ich werde versuchen, in anderen Worten. Das problem ist klar. Die Frage ist, wie man das in Pythonic way. Option 1: Die Art und Weise, die Sie verstehen, Option 2: Der grundlegende Ansatz ich in der Frage beschriebenen. Die Frage ist also, alle anderen Pythonic Möglichkeiten, das zu tun? Kommentarautor: bagrat

InformationsquelleAutor der Frage bagrat | 2015-07-28

Schreibe einen Kommentar