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.)
BEARBEITEKönnte seinpep 342 ist die Lösung?