假设我有一些经理对象.这个对象的API有一个main_hook函数,它获取另一个函数f作为它的参数,并f在循环中运行给定的东西,在每次迭代之间做一些事情:
def main_hook(self,f):
while (self.shouldContinue()):
#do some preparations
f(self)
#do some tear down
Run Code Online (Sandbox Code Playgroud)
现在,我也有(更确切地说,想要)一个函数stop_and_do_stuff,一旦被调用,就停止main_hook在它的轨道中,将控制返回到所调用的函数main_hook,然后在该函数完成它正在做的事情之后,将控制权交还给main_hook和继续.基本上结果与做的一样
def main_hook(self,f):
while (self.shouldContinue()):
#do some preparations
yield
#do some tear down
Run Code Online (Sandbox Code Playgroud)
除此之外,yield我想打电话给f(),同时给出f打电话的选项self.stop_and_do_stuff()
我不能通过使f也成为发电机来解决这个问题有两个原因:
1. f不是我的API的一部分 - 它是由使用我的lib的用户提供给我的
2.即使可以要求他使用yield,他需要调用的代码中的位置stop_and_do_stuff也不会直接位于f内,而是位于函数堆栈中的某个位置f(),而不是直接位于其中,例如
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() …Run Code Online (Sandbox Code Playgroud)