Pythonの単一の下線「_」変数の目的は何ですか?


618

このコードで_after の意味は何forですか?

if tbh.bag:
   n = 0
   for _ in tbh.bag.atom_set():
      n += 1


5
あなたのケースでは、len(tbh.bag.atom_set())(戻り値に__len__メソッドがある場合)またはsum(1 for _ in tbh.bag.atom_set())
Nick T

ではpylintダミー変数名の別のオプションの接頭辞であるdummy_変数名のために。この接頭辞をとともに使用すると、警告pylintpylint出されません。また、のpylintようなものに対応するためのダミー変数パターンを設定することもできます__
Trevor Boyd Smith

回答:


780

_ Pythonには4つの主な従来の用途があります。

  1. インタラクティブインタープリターセッションで最後に実行された式(/ステートメント)の結果を保持します。この先例は標準のCPythonインタープリターによって設定され、他のインタープリターも同様に続いています
  2. 次の ようなコードのように、i18nの翻訳ルックアップ(たとえば、gettextのドキュメントを参照 )。 raise forms.ValidationError(_("Please enter a correct username"))
  3. 次のようなコードのように、関数の結果の一部が意図的に無視されている(概念的には破棄されている)ことを示すための汎用の「使い捨て」変数名 label, has_label, _ = text.partition(':')
  4. 関数定義の一部として(defまたはを使用lambda)、シグネチャは(たとえば、コールバックまたは親クラスAPIによって)修正されますが、この特定の関数の実装は、次のようなコードのように、すべてのパラメーターを必要としません。callback = lambda _: True

(長い間、この回答では最初の3つのユースケースしかリストされていませんでしたが、4番目のケースは、ここで述べたように、明示的にリストする価値があるほど頻繁に出てきました)

後者の「使い捨て変数またはパラメーター名」の使用例は、トランスレーションルックアップの使用例と競合する可能性があるため_、i18n変換にも使用するコードブロックで使い捨て変数として使用することを避ける必要があります(多くの人はダブルアンダースコアを好む) 、__、)まさにこの理由のために彼らの使い捨ての変数として。


19
たとえば、関数呼び出しでどのように機能するかを説明してください。例:raise forms.ValidationError(_( "正しいユーザー名を入力してください"))。私はこれをDjangoコードで見ましたが、何が起こっているのかは明確ではありません。
ジョンC、

41
つまり、使用法2-慣例により、_国際化およびローカリゼーション文字列変換ルックアップを行う関数に使用される名前です。gettextその慣習を確立したのはC ライブラリであると私は確信しています。
ncoghlan '19年

43
FWIW、私は__最初の2つの使用例のいずれかとの競合を回避するために、汎用の使い捨て変数として(二重下線)を個人的に使用し始めました。
ncoghlan 2012年

14
創発的なコミュニティの慣習には、信頼できる情報源がない傾向があります-時間の経過とともに現れてきた慣行の観察だけです。FWIW、私はより多くの最近のPEP 8つの更新プログラムの共著者の一人です、そして私の答えは、私が見てきた3種類の方法に基づいており_、私は2002年に専門的にはPythonを使用して開始して以来、変数名として使用
ncoghlan

12
規則は主にタプルのアンパックを対象a, __, c = iterableとしています。3タプルをアンパックすることを読者にすぐに伝えますが、最初と最後の値のみを使用します。私たちが代わりに書いた場合a, b, c = iterable、リーダー(または自動化されたコードリンター)が合理的にすべてを期待することができabc後で使用するために(そして、彼らがいないのであれば、それはバグのどこかの徴候である可能性があり)。
ncoghlan 2016

207

これは単なる変数名であり_、使い捨て変数に使用するのはPythonでは慣例です。ループ変数が実際には使用されていないことを示しているだけです。


5
それは最後の戻り値を表していないということですか?
alwbtc

31
@steveはPython シェルで
Gabi Purcaru

4
プロローグでの_の使用に似ています
Matthias

3
Matlabでの〜の使用と同様
PatriceG 2017

cpythonシェルでを明示的に定義する_と、前の式の出力値の保持が永久に停止することに注意してください。これはひどく矛盾しているようで、Python lang標準はこれに対処する必要があります。_使い捨ての名前として定義し、実際の識別子として使用されないようにする必要があります。
theferrit32

78

アンダースコア_はPythonでは「I do n't Care」または「Throwaway」変数と見なされます

  • Pythonインタープリターは、最後の式の値をという特別な変数に保存します_

    >>> 10 
    10
    
    >>> _ 
    10
    
    >>> _ * 3 
    30
  • アンダースコア_は、特定の値を無視するためにも使用されます。特定の値が必要ない場合、または値が使用されない場合は、値をアンダースコアに割り当てます。

    解凍時に値を無視する

    x, _, y = (1, 2, 3)
    
    >>> x
    1
    
    >>> y 
    3

    インデックスを無視する

    for _ in range(10):     
        do_something()

2
3番目の使用法は、国際化機能_("Hello world!")です。
Jeff Younker 2018年

3
プロセッサレベルで、「for _ in range」と「for x in range」に実際の違いはありますか、それからxを使用していませんか?それとも人間の読みやすさのためだけですか?
iammax 2018

1
@iammax disモジュールを使用して、バイトコードに違いがないことがわかりました。ただし、人間が読みやすいことの利点は明らかです。
Alistair Carscadden、2018

21

Pythonでアンダースコアを使用するケースは5つあります。

  1. インタプリタに最後の式の値を格納するため。

  2. 特定の値を無視するため。(いわゆる「気にしない」)

  3. 変数または関数の名前に特別な意味と機能を与えるため。

  4. 「Internationalization(i18n)」または「Localization(l10n)」関数として使用します。

  5. 数値リテラル値の桁を分離します。

これmingrammerによる例を含む素晴らしい記事です。


2
実際、これはかなり新しい ブログです。pythonlibrary.org
2017/01/11 /

3

Python言語に関する限り、_特別な意味はありません。これは、またはと同様に有効な識別子です。_foofoo__f_o_o_

の特別な意味_は、純粋に慣例によるものです。いくつかのケースが一般的です:

  • 変数の使用が意図されていないが、構文/セマンティクスで名前が必要な場合のダミー名。

    # iteration disregarding content
    sum(1 for _ in some_iterable)
    # unpacking disregarding specific elements
    head, *_ = values
    # function disregarding its argument
    def callback(_): return True
  • 多くのREPL /シェルは、最後のトップレベルの式の結果をに格納しbuiltins._ます。

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

    名前の検索方法が原因で、グローバルまたはローカル_定義によってシャドウされない限り、ベア_はを参照しbuiltins._ます。

    >>> 42
    42
    >>> f'the last answer is {_}'
    'the last answer is 42'
    >>> _
    'the last answer is 42'
    >>> _ = 4  # shadow ``builtins._`` with global ``_``
    >>> 23
    23
    >>> _
    4

    注:などの一部のシェルipythonは、に割り当てられずbuiltins._、特殊なケースになり_ます。

  • インターナショナライゼーションとローカライゼーションのコンテキストで_は、プライマリ翻訳機能のエイリアスとして使用されます。

    gettext.gettext(message)

    現在のグローバルドメイン、言語、およびロケールディレクトリに基づいて、メッセージのローカライズされた翻訳を返します。この関数は通常、ローカル名前空間で_()としてエイリアスされます(以下の例を参照)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.