Что такое __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__
, так что это действительно может быть что-то.
Зная, где вы нашли, было бы неплохо начать...