Что такое __return__?

Я отлаживаю script в Python 3.1 и обнаружил это:

(Pdb) p locals() {'count': 264, 'self':, 'depth': 1, 'offset': 0, '__ return__': None, 'blkno': 4, 'size': 264}

Я нашел отложенный PEP, который упоминает об этом, и еще немного.

Что такое __return__? Когда он был добавлен? Как это полезно?

Ответы

Ответ 1

Это возвращаемое значение вызова функции, когда отладчик 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__ == None каждый раз.

Ответ 2

Ключевое слово __return__ отображается только в коде отладчика:

[email protected]:~/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__']

Ответ 3

Это обычное или садовое локальное имя, возможно, имя функции или значения, как вы можете сказать из-за того, что его имя находится в locals(). Вам нужно будет посмотреть на код, который определяет его, чтобы узнать, для чего он используется. Тот факт, что он начинается с двузначного подчеркивания, означает, что это особая ценность какого-то рода; возможно, он использовал для возврата значения для некоторой функции. Однако сам Python не имеет никакого особого значения для имени __return__, так что это действительно может быть что-то.

Зная, где вы нашли, было бы неплохо начать...