708

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

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

5 に答える 5

899

_Python では 3 つの主な従来の用途があります。

  1. 対話型インタープリター セッションで最後に実行された式の結果を保持するため ( docsを参照)。この前例は、標準の CPython インタープリターによって設定され、他のインタープリターもそれに続いています。

  2. i18n での翻訳ルックアップ (たとえば、 gettextの ドキュメントを参照) の場合、次のようなコードのように

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

    1. 関数の結果の一部が意図的に無視されている (概念的には破棄されている) ことを示すには、次のようなコードを使用します。

      label, has_label, _ = text.partition(':')
      
    2. 関数定義の一部として ( または のいずれdefかを使用lambda)、署名は (コールバックまたは親クラス API などによって) 修正されますが、この特定の関数の実装では、次のようなコードのようにすべてのパラメーターは必要ありません。

      def callback(_):
          return True
      

      [長い間、この回答にはこのユースケースが記載されていませんでしたが、ここに記載されているように、明示的に記載する価値があるほど頻繁に出てきました。]

    このユース ケースは、翻訳ルックアップのユース ケースと競合する可能性があるため、i18n 翻訳にも使用するコード ブロックでは、使い捨て変数として使用しないようにする必要があります (多くの人は、正確な翻訳の使い捨て変数として、_2 つのアンダースコアを好みます) 。__この理由)。

    多くの場合、Linter はこのユースケースを認識しています。たとえば、コードの後半で が使用されていないyear, month, day = date()場合、lint 警告が発生dayします。day本当に必要ない場合の修正は、と書くことyear, month, _ = date()です。ラムダ関数と同様に、lambda arg: 1.01 つの引数を必要とするがそれを使用しない関数を作成します。これは lint によってキャッチされます。修正は書くことlambda _: 1.0です。未使用の変数は、多くの場合、バグ/タイプミスを隠しています (たとえば、設定されているが次の行でday使用dyaされている)。

    Python 3.10 で追加されたパターン マッチング機能は、この使用法を「慣習」からmatchステートメントが関係する「言語構文」に昇格させました: 一致の場合、_ワイルドカード パターンであり、その場合、ランタイムはシンボルに値をバインドしません。 .

    _他の使用例では、それは依然として有効な変数名であり、したがってオブジェクトを存続させ続けることを覚えておいてください。これが望ましくない場合 (メモリや外部リソースを解放する場合など) は、明示的なdel name呼び出しにより、その名前が使用されていることをリンターが満足、オブジェクトへの参照が即座にクリアされます。

于 2011-05-05T07:10:47.657 に答える
240

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

于 2011-05-05T05:47:50.853 に答える