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)
EDITARTalvezpep 342 é a solução?