拆卸发电机会产生令人惊讶的结果

时间:2015-01-13 11:40:21

标签: python python-2.7 generator yield python-internals

我知道如何使用发电机,但我对它们的内部结构一无所知。我试过这个:

In [4]: def f(): yield 1
In [6]: type(f())
Out[6]: generator

现在我把它拆开了:

In [7]: dis.dis(f)
  1           0 LOAD_CONST               1 (1)
              3 YIELD_VALUE         
              4 POP_TOP             
              5 LOAD_CONST               0 (None)
              8 RETURN_VALUE        

为什么操作码建议return Nonef实际返回生成器?

1 个答案:

答案 0 :(得分:5)

如果没有显式返回,则所有函数在其末尾返回None,生成器也不例外。从Python 3.3开始,生成器在结束时可以return a final value,但是在Python 2.7中,如果使用return提前结束函数,则必须返回空白。

这是对Python框架实现方式的“限制”;你必须有一个RETURN_VALUE操作码来干净地退出框架并展开堆栈,并且操作码总是需要一个操作数。

调用该函数仍然会生成一个生成器,但在实际调用生成器上的.next()方法之前,字节代码不会执行。