invoking Ausbeute für einen Generator in einer anderen Funktion

Angenommen, ich habe ein Managerobjekt. Die API dieses Objekts hat einmain_hook Funktion, die eine andere Funktion bekommtf als Argument und führt das angegebene @ af in einer Schleife, die zwischen den einzelnen Iterationen ein paar Dinge ausführt:

def main_hook(self,f):
    while (self.shouldContinue()):
        #do some preparations
        f(self)
        #do some tear down

Jetzt habe ich auch (genauer gesagt,würde gerne habe) eine Funktionstop_and_do_stuff, das einmal aufgerufen wurde, stopptmain_hook tot in der Spur, gibt die Steuerung an die Funktion mit dem Namen @ zurümain_hook, und nachdem die Funktion beendet ist, kehren Sie zu main_hook zurück und fahren fort. Grundsätzlich ist das Ergebnis dasselbe wie bei "@"

def main_hook(self,f):
    while (self.shouldContinue()):
        #do some preparations
        yield
        #do some tear down

Außer dass stattdessenyield Ich möchte @ anruff(), während @ gebf die Option, @ anzurufself.stop_and_do_stuff()

I kippe Umgehen Sie dieses Problem, indem Sie f aus zwei Gründen ebenfalls zu einem Generator machen:

1.f ist nicht Teil meiner API - es wird mir von einem Benutzer gegeben, der meine lib @ verwende

2.Selbst wenn Sie ihn bitten könnten, yield zu verwenden, geben Sie die Stelle im Code an, an der er @ aufrufen musstop_and_do_stuff wird nicht direkt in f sein, sondern an einer Stelle im Funktionsstapel, die sich in @ befindef(), aber nicht direkt darin, z. B.

def h(manager):
    #do stuff
    if should stop:
        manager.stop_and_do_stuff()
    #do more stuff
def g(manager):
    #some stuff
    if should stop:
        manager.stop_and_do_stuff()
    #more stuff
    if should stop again:
        manager.stop_and_do_stuff()  
    if should call h:
        h()
def f(manager):
    g(manager)

so wenn ich mich entscheide @ zu machf ein generator muss ich auch macheng ein Generator und auchh, sonst funktioniert dieser Trick nicht.

Gibt es eine Lösung für all das? vielleicht versuche ich es falsch zu lösen?

(Ich weiß, diese Frage ist lang und hässlich - es ist das Beste, was ich tun kann. Wenn etwas nicht klar ist, sag es mir bitte und ich werde es klären.)

BEARBEITE

Könnte seinpep 342 ist die Lösung?

Antworten auf die Frage(10)

Ihre Antwort auf die Frage