什么是__return__?

16 投票
3 回答
2523 浏览
提问于 2025-04-16 12:16

我在调试一个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

撰写回答