Присваивая значение одного символа подчеркивания в интерпретаторе 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`


почему? Что не так с этой функцией?

624   3  

3 ответов:

интерпретатор Python присваивает последнее значение выражения _.

это поведение ограничено REPL переводчик только, и предназначен для оказания помощи в интерактивных сеансах кодирования:

>>> import math
>>> math.pow(3.0, 5)
243.0
>>> result = _
>>> result
243.0

The стандартный интерпретатор Python идет на некоторую длину, чтобы не топтать определенные пользователем значения; если вы сами назначаете что-то другое до _ тогда интерпретатор не будет перезаписывать это (технически говоря,_ переменная __builtin__ атрибут, ваши собственные задания являются "обычными" глобалами). Однако вы не используете стандартный интерпретатор Python; вы используете IPython, и этот интерпретатор не так осторожен.

IPython документы это поведение явно:

следующие глобальные переменные всегда существуют (так что не перезаписывайте их!):

  • [_] (один подчеркивание): сохраняет предыдущий вывод, например интерпретатор Python по умолчанию.

[...]

вне интерпретатора Python, _ по соглашению используется в качестве имени переводимой текстовой функции (см. gettext модуль; внешние инструменты искать эту функцию для извлечения переводимых строк).

в петли, используя _ как цель назначения сообщает читателям вашего кода, что вы собираюсь игнорировать это значение, например [random.random() for _ in range(5)] создать список из 5 случайных значений с плавающей точкой.

_ - это специальная переменная в интерпретаторе, она всегда присваивается результату предыдущего выражения. Так что тебе не стоит так его использовать.

кстати проблема, похоже, связана с оболочкой 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 _ ведет себя иначе, чем python оболочки _; даже если вы назначите его какой-то переменной, то он также будет обновляться, как только вы сделаете некоторые вычисления.

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 модуль для получения дополнительной информации об этой конвенции.

Если вы создаете переменную, назначенную"_", она маскируется/маскирует системную переменную _.

Comments

    Ничего не найдено.