动态调用函数和生成器函数(python)

时间:2013-09-13 02:54:20

标签: python dynamic python-2.7 generator

以下代码仅打印“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()

为什么会这样?是否可以以类似的动态方式调用生成器函数?

4 个答案:

答案 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,其解释如下:

  

当调用生成器函数时,实际参数以通常的方式绑定到函数本地形式参数名称,但函数体中没有代码被执行。