【发布时间】:2023-03-03 00:52:01
【问题描述】:
假设我有一些经理对象。这个对象的 API 有一个 main_hook 函数,它获取另一个函数 f 作为它的参数,并在循环中运行给定的 f,在每次迭代之间做一些事情:
def main_hook(self,f):
while (self.shouldContinue()):
#do some preparations
f(self)
#do some tear down
现在,我也有(更准确地说,希望有)一个函数 stop_and_do_stuff,一旦被调用,就会停止 main_hook 死在它的轨道上,将控制权返回给调用的函数main_hook,在 func 完成它的工作后,将控制权返回给 main_hook 并继续。基本上结果会和做的一样
def main_hook(self,f):
while (self.shouldContinue()):
#do some preparations
yield
#do some tear down
除了yield 我想打电话给f(),同时给f 打电话给self.stop_and_do_stuff() 的选项
我无法通过将 f 设为生成器来解决此问题,原因有两个:
1.f 不是我的 API 的一部分 - 它是由使用我的库的用户提供给我的
2.即使可以要求他使用yield,他需要调用stop_and_do_stuff的代码中的位置也不会直接在f内部,而是在函数堆栈中的某个位置,该位置将在@内部987654336@,但不是直接在里面,例如
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)
所以如果我选择将f 设为生成器,我还需要将g 设为生成器以及h,否则此技巧将不起作用。
这一切有什么解决办法吗?也许我试图以错误的方式解决它?
(我知道这个问题又长又丑——这是我能做的最好的了。如果有什么不清楚的地方请告诉我,我会澄清的)
编辑
也许pep 342 是解决方案?
【问题讨论】:
-
我和阿努拉格有同样的理解,也认为(像他一样)你真的没有问问题,而是提供了你自己的解决方案的元素(这还行不通)。所以你能期望的最好的就是让你的解决方案起作用,而不是得到一个真正的 Pythonic 解决方案。另外,从我在问题中看到的情况来看,我有一种奇怪的感觉。将函数称为“做某事”而不是“返回结果”对我来说似乎很奇怪,听起来你正在做的主要是一些交互式副作用。是吗?
-
我不清楚如果 f 是一个外部库函数,它怎么能在中间调用 stop_and_do_stuff ,如果它可以做到,为什么它不能屈服?
-
@Anurag-f 得到一个
manager对象作为它的参数,它有函数 stop_and_do_stuff
标签: python function generator yield