什么是__return__?
我在调试一个Python 3.1的脚本时发现了这个:
(Pdb) p locals() {'count': 264, 'self': , 'depth': 1, 'offset': 0, '__return__': None, 'blkno': 4, 'size': 264}
我找到了一些关于这个的资料,像是延迟PEP,但其他的资料不多。
那什么是 __return__
呢? 它是什么时候被加入的?有什么用呢?
3 个回答
1
这是一个常见的本地名称,可能是某个函数或值的名字。从它出现在 locals()
这个地方可以看出来。要了解它的用途,你需要查看定义它的代码。它的名字以双下划线开头,这暗示它可能是某种特殊的值;也许它是用来保存某个函数的返回值的。不过,Python 本身并没有给 __return__
这个名字赋予特殊的含义,所以它实际上可以是任何东西。
知道你在哪里找到它会是一个很好的开始...
10
这个__return__
关键字只出现在调试器的代码中:
matt@stanley:~/src/Python-3.2$ grep -R __return__ .
./Lib/pdb.py: frame.f_locals['__return__'] = return_value
./Lib/pdb.py: if '__return__' in self.curframe_locals:
./Lib/pdb.py: self.message(repr(self.curframe_locals['__return__']))
./Lib/bdb.py: if '__return__' in frame.f_locals:
./Lib/bdb.py: rv = frame.f_locals['__return__']
15
这是一个函数调用的返回值,当pdb调试器在执行返回命令后停止时会看到这个值。对于那些有副作用的返回表达式(比如读取管道中的一行,这种操作是不能重复的)来说,这个返回值非常重要。
(Pdb) ... # stop somewhere in the debugger ...
> test.py(3)f()
-> return x + 1
(Pdb) l # list source: I'm just before return
1 def f():
2 x = 7
3 -> return x + 1
(Pdb) '__return__' in locals() # __return__ is still undefined
False
(Pdb) s
--Return--
> test.py(3)f()->8 # This printed 8 is a simple case, but frequently
(Pdb) '__return__' in locals() # the value is an object or line shortened to 80 ch.
True # __return__ has the value after return
(Pdb) __return__
8
如果函数在没有执行return命令的情况下退出,那么每次的返回值就是__return__ == None
。