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énhDe 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é)

EDITAR

Tal vezpep 342 es la solucion?

Respuestas a la pregunta(5)

Su respuesta a la pregunta