invocando rendimento para um gerador em outra função

suponha que eu tenha algum objeto gerente. A API deste objeto tem ummain_hook função, que recebe outra funçãof como argumento, e executa o dadof em um loop, fazendo algumas coisas entre cada iteração:

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

Agora, eu também tenho (com mais precisão,gostaria de ter) uma funçãostop_and_do_stuff, que uma vez chamado, paramain_hook morto em suas trilhas, retorna o controle para qualquer função chamadamain_hook, e depois que a função terminar o que está fazendo, volte ao controle main_hook e continue. Basicamente, o resultado será o mesmo que fazer

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

Exceto que, em vez dissoyield Eu quero ligar paraf(), dandof a opção de ligarself.stop_and_do_stuff()

I não pode contornar isso, tornando f também um gerador por 2 razões:

1f não faz parte da minha API - ela é fornecida por um usuário que usa minha lib

2. Mesmo que possa pedir a ele para usar yield, o local no código em que ele precisará chamarstop_and_do_stuff não estará diretamente dentro de f, mas em algum lugar da pilha de funções que estará dentrof(), mas não diretamente, por exemplo

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)

então se eu escolher fazerf um gerador, eu também preciso fazerg um gerador e tambémh, caso contrário, esse truque não funcionará.

Existe alguma solução para tudo isso? talvez eu esteja tentando resolver da maneira errada?

(Eu sei que esta pergunta é longa e feia - é o melhor que eu poderia fazer. Se algo não estiver claro, por favor me diga e eu o esclarecerei)

EDITAR

Talvezpep 342 é a solução?

questionAnswers(5)

yourAnswerToTheQuestion