Invocar rendimiento para un generador en otra función
supongamos que tengo algún objeto administrador. La API de este objeto tiene unmain_hook
función, que obtiene otra funciónf
como argumento, y ejecuta el dadof
en un bucle, haciendo algunas cosas entre cada iteración:
def main_hook(self,f):
while (self.shouldContinue()):
#do some preparations
f(self)
#do some tear down
Ahora, también tengo (más exactamente,me gustaría tener) Una funciónstop_and_do_stuff
, que una vez llamado, se detienemain_hook
muerto en sus pistas, devuelve el control a cualquier función llamadamain_hook
, y después de que la función termine lo que está haciendo, recupere el control de main_hook y continúe. Básicamente el resultado será el mismo que hacer
def main_hook(self,f):
while (self.shouldContinue()):
#do some preparations
yield
#do some tear down
Excepto que en su lugaryield
Quiero tener una llamada paraf()
, mientras daf
la opción de llamarself.stop_and_do_stuff()
I hipocresía evite esto haciendo que f también sea un generador por 2 razones:
1)f
no es parte de mi API, me la dio un usuario que usa mi lib
2. Incluso si pudiera pedirle que use rendimiento, el lugar en el código en el que deberá llamarstop_and_do_stuff
no estará directamente dentro de f, sino en algún lugar de la pila de funciones que estará adentrof()
, pero no directamente en él, p.
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)
entonces si elijo hacerf
un generador, también necesito hacerg
un generador y tambiénh
De lo contrario, este truco no funcionará.
¿Hay alguna solución a todo esto? tal vez estoy tratando de resolverlo de la manera incorrecta?
(Sé que esta pregunta es larga y fea, es lo mejor que puedo hacer. Si algo no está claro, dígamelo y lo aclararé)
EDITARTal vezpep 342 es la solucion?