web-dev-qa-db-ja.com

Python / IPythonインタープリターで単一のアンダースコア_に値を割り当てる

この関数はPython 2.7 with 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`
_

どうして?この関数の何が問題になっていますか?

69
eolandro

Pythonインタープリターは、最後の式の値を_に割り当てます。

この動作は REPLインタープリター のみに制限されており、インタラクティブなコーディングセッションを支援することを目的としています。

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

standardPythonインタープリターは、ユーザー定義の値を踏みにじらないようにある程度の長さになります。自分で何かを割り当てた場合else_にすると、インタプリタはそれを上書きしません(技術的に言えば、 _変数は__builtin__属性です 、独自の割り当て標準のPythonインタープリターを使用していませんが、IPythonを使用しており、そのインタープリターはそれほど注意深くありません。

IPython この動作を明示的に文書化します

次のグローバル変数は常に存在します(したがって、それらを上書きしないでください!):

  • [_](単一のアンダースコア):Pythonのデフォルトのインタープリターのように、以前の出力を格納します。

[...]

標準のPython REPL環境では、_に何かを割り当てた場合でも、__builtins__._を介して、またはそれをシャドウする_グローバルを削除することで、最後の式の結果にアクセスできます。再び(del _)。

Pythonインタープリターの外では、_は慣例により、翻訳可能なテキスト関数の名前として使用されます( gettextモジュールを参照 ;外部ツールは翻訳可能な文字列を抽出する関数)。

また、慣例により、割り当てターゲットとして_を使用すると、コードの読者にその値を無視することが通知されます。例えば5つのランダムなfloat値のリストを生成するための[random.random() for _ in range(5)]、またはタプル割り当てから3番目の値を通知するためのfoo, bar, _ = three_valuesは使用されません。 _がすでにgettext関数に使用されている場合、__は同じ目的で使用できます。

105
Martijn Pieters

_はインタプリタの特別な変数であり、常に前の式の結果に割り当てられます。だから、あなたはそれをそのように使うべきではありません。

ところで、この問題はIPython Shellに関連しているようです。これは、コードが通常のpython Shell:

通常のpythonシェルで変数_に何かを割り当てると、そのオブジェクトのみに割り当てられたままになり、特別な動作が失われます。


Pythonシェル:

>>> 2*2
4
>>> _         #works as expected
4
>>> _ = 2     #after assignment, it's magic functionality is gone
>>> _*5       
10
>>> _
2

IPythonシェル

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のデフォルトのインタープリターのように、以前の出力を格納します。 ..

From python docs

特別な識別子_は、最後の評価の結果を格納するために対話型インタプリタで使用されます。 __builtin__モジュールに保存されます。インタラクティブモードでない場合、_には特別な意味はなく、定義されていません。

_という名前は、国際化と組み合わせて使用​​されることがよくあります。この規則の詳細については、gettextモジュールのドキュメントを参照してください。

30