1. ホーム
  2. python

[解決済み] Pythonのシングルアンダーコア"_"変数の目的は何ですか?

2022-03-14 19:34:16

質問

の意味は何ですか? _for というのは、このコードのことでしょうか?

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

解決方法は?

_ は、Pythonで従来から主に3つの用途があります。

  1. 対話的な式の中で,最後に実行された式の結果を保持する インタプリタ・セッション ( ドキュメント ). この前例は、標準の CPython 他のインタプリタもこれに倣っています。

  2. i18nでの翻訳ルックアップについては( ゲットテキスト のようなコードで、例えば

    raise forms.ValidationError(_("Please enter a correct username"))
    
    
  3. 汎用的な使い捨ての変数名として。

    1. の一部を示す。 のように、関数の結果を意図的に無視している(概念的には破棄している)コードです。

      label, has_label, _ = text.partition(':')
      
      
    2. 関数定義の一部として def または lambda ) で、ここで の場合、シグネチャは(コールバックや親クラスのAPIなどで)固定されていますが この特定の関数の実装は、すべての関数が必要なわけではありません。 のようなコードのように、パラメータを指定します。

      def callback(_):
          return True
      
      

      [長い間、この回答ではこのユースケースを挙げていませんでしたが、指摘されているように、よく出てきました。 こちら 明示的に記載する価値がある] 。

    このユースケースは、翻訳ルックアップのユースケースと衝突する可能性があるので _ を、国際化翻訳にも使用するコードブロックの中で、使い捨ての変数として使用します(多くの人々は、ダブルアンダースコアを好みます。 __ このような理由から、使い捨ての変数として使用するのです。)

    リンターは、この使用例をよく認識しています。例えば year, month, day = date() を指定すると、lint警告が発生します。 day を使用しない場合は、コードの後半で使用します。この修正は、もし day が本当に必要ない場合は、次のように記述します。 year, month, _ = date() . ラムダ関数も同じです。 lambda arg: 1.0 は、1つの引数を必要とするが、それを使用しない関数を作成し、これはlintによって捕捉されます。修正方法は lambda _: 1.0 . 未使用の変数には、多くの場合、バグやタイポが隠されています(例:set day を使用していますが dya を次の行に追加してください)。

    Python 3.10 で追加されたパターンマッチ機能により、この使い方は "慣習" から "言語構文" に昇格し、以下のようになりました。 match ステートメントが関係する:マッチケースで _ ワイルドカードパターン この場合、ランタイムはシンボルに値をバインドすることさえしません。

    その他のユースケースについては、以下のことを思い出してください。 _ はまだ有効な変数名であり、したがってオブジェクトはまだ生きています。これが望ましくない場合 (たとえばメモリや外部リソースを解放するため) は、明示的に del name の呼び出しは、どちらもその名前が使用されていることをリンタに知らせます。 オブジェクトへの参照を速やかにクリアする。