以下代码仅打印“good”。为什么不执行发电机功能? 我注意到pdb在执行'handlers1'之后,脚本到达了f1定义的行,但后来没有进入函数内部。相反,它返回'GeneratorExit:None'。
class foo:
def f0(self, s):
print s
def f1(self, s):
print "not " + s
yield 1
def run(self):
handlers={0 : self.f0, 1 : self.f1}
handlers[0]('good')
handlers[1]('good')
bar = foo()
bar.run()
为什么会这样?是否可以以类似的动态方式调用生成器函数?
答案 0 :(得分:4)
一个不调用生成器函数,就像调用普通函数一样。生成器函数在调用时不会运行,而是返回迭代器。这个迭代器在传递给next()
或在其他迭代上下文中使用时,会调用原始函数:
>>> def f1(s):
... print(s)
... yield
...
>>> it = f1("hello")
>>> next(it)
hello
>>>
要在另一个答案中继续讨论,这里有一种调用常规函数或生成器函数的方法:
>>> def f0(s):
... print s
...
>>> def f1(s):
... print s
... yield
...
>>> try: next(f0("hello"))
... except TypeError: pass
...
hello
>>> try: next(f1("hello"))
... except TypeError: pass
...
hello
>>>
答案 1 :(得分:2)
您需要致电next
,否则生成器中的代码将无法运行。
class foo:
def f0(self, s):
print s
def f1(self, s):
print "not " + s
yield 1
def run(self):
handlers={0 : self.f0, 1 : self.f1}
handlers[0]('good')
handlers[1]('good').next()
bar = foo()
bar.run()
打印出“好”然后“不好”。
答案 2 :(得分:1)
当你使用生成器函数时,它只返回一个迭代器。你应该 尝试调用生成器的下一个方法来执行生成器函数体。 试试这个:
class foo:
def f0(self, s):
print s
def f1(self, s):
print "not " + s
yield 1
def run(self):
handlers={0 : self.f0, 1 : self.f1}
for _, func in handlers.iteritems():
res = func('good')
if hasattr(res, 'next'):
next(res)
bar = foo()
bar.run()
答案 3 :(得分:1)
调用生成器函数,但调用生成器函数不会立即执行任何操作。阅读the documentation,其解释如下:
当调用生成器函数时,实际参数以通常的方式绑定到函数本地形式参数名称,但函数体中没有代码被执行。