Присвоение значения одному подчеркиванию в интерпретаторе Python/IPython
Я создал эту функцию в Python 2.7 с ipython
:
def _(v):
return v
позже, если я называю _(somevalue)
, Я _ = somevalue
.
in[3]: _(3)
out[3]: 3
in[4]: print _
out[4]: 3
функция исчезла! Если я позову _(4)
Я:
TypeError: 'int' object is not callable`
почему? Что не так с этой функцией?
3 ответов
интерпретатор Python присваивает последнее значение выражения _
.
это поведение ограничено REPL переводчик только, и предназначен для оказания помощи в интерактивных сеансах кодирования:
>>> import math
>>> math.pow(3.0, 5)
243.0
>>> result = _
>>> result
243.0
на стандартный интерпретатор Python идет на некоторую длину, чтобы не попирать пользовательские значения; если вы сами назначаете что-то другое to _
тогда интерпретатор не будет перезаписывать это (технически говоря,_
переменная __builtin__
атрибут, ваши собственные задания являются "регулярными" глобалами). Однако вы не используете стандартный интерпретатор Python; вы используете IPython, и этот интерпретатор не так осторожен.
оболочкой IPython документы это поведение явно:
следующие глобальные переменные всегда существуют (поэтому не перезаписывайте их!):
[_]
(один подчеркивание): сохраняет предыдущий вывод, например интерпретатор Python по умолчанию.[...]
вне интерпретатора Python, _
по соглашению используется в качестве имени переводимой текстовой функции (см. gettext
модуль; внешние инструменты искать эту функцию для извлечения переводимых строк).
в петли, используя _
как цель назначения сообщает читателям вашего кода, что вы проигнорируем это значение; например [random.random() for _ in range(5)]
для создания списка из 5 случайных значений float.
_
- специальная переменная в интерпретаторе, она всегда присваивается результату предыдущего выражения. Так что не стоит так его использовать.
кстати проблема, похоже, связана с оболочкой IPython, потому что ваш код отлично работает в обычной оболочке python:
в обычной оболочке python, когда вы назначаете что-либо переменной _
тогда он останется назначенным только этому объекту и потеряет его специальное поведение.
Python Шелл:
>>> 2*2
4
>>> _ #works as expected
4
>>> _ = 2 #after assignment, it's magic functionality is gone
>>> _*5
10
>>> _
2
IPython shell:
В IPython _
ведет себя иначе, чем _
; даже если вы назначите его какой-то переменной, он также будет обновлен, как только вы выполните некоторые вычисления.
In [1]: 2*2
Out[1]: 4
In [2]: _
Out[2]: 4
In [3]: _ = 10
In [4]: _*10
Out[4]: 100
In [5]: _
Out[5]: 100
С оболочкой IPython это docs:
следующие глобальные переменные всегда существуют (поэтому не перезаписывайте их!):
_ : (одно подчеркивание): сохраняет предыдущие выходные данные, такие как Python интерпретатор по умолчанию. ..
из python docs:
специальный идентификатор
_
используется в интерактивном интерпретаторе для сохранить результат последней оценки; он хранится в__builtin__
модуль. Когда не в интерактивном режиме,_
не имеет особого значения и не определяется.Примечание имя
_
часто используется в сочетании с интернационализацией; обратитесь к документации для gettext модуль для получения дополнительной информации об этой конвенции.