39

いくつかのフレームワークのコールバックの実装である関数/メソッドがあり、それ以上の引数を気にしない場合、構文的に正しいようであり、*_興味を示さないために使用するpylint/IDEの苦情はありませんさらなる議論。私が思うに、これらの議論は現在関連性がないということを、ツールと他の開発者の両方に意図を表明することです。

私が何を意味するかを明確にするために:

def my_callbacK_handler(a, b, *_):
    ...

私はこのイディオムが実際に使用されているのを見たことがありません-それは一般的ですか、例があり、これに関する既知の問題がありますか?

なじみのない人のために:_私がそのシンボルに興味がないという意図を表現します-IDEとリンターによって認識されるのはPythonの「ダミー」です。

4

3 に答える 3

40

_は他の変数と同じように単なる変数ですが、慣例により、その値を使用するつもりはなく、宣言して忘れることを意味します。

[OrderedSet() for _ in xrange(n)]

n空の順序集合のリストを作成します。_はインデックスですが、使用されていません。_必要に応じて一般的に使用されますが、未使用の変数名(Pythonだけでなく)。これを行うための組み込み構文がないため、これはトリッキーなPythonイディオムです。

これが他の言語で見られることは珍しくありません(_有効な識別子はどこにありますか)。_多くの場合、の値には関心がないが、構文上の理由から必要な変数を意味します。

マクロ呼び出しには別の従来の意味があることに注意してください_(...)。これはgettextに由来し、_("string literal")ローカリゼーションが必要な文字列を示すために使用されます。

ActivesStateから読み取るスレッド

私は問題について言うことはできません、Pythonはそれを内部的に使用しません、それはただの変数です、注意しなければならないのは私たちです。


*と**の構文について:名前*args**kwargsは慣例によるものですが、使用する必要はありません。

def my_callbacK_handler(a, b, *_):
    ...

_したがって、この関数をイディオムでコードに表示すると、この関数は動作時ab引数のみを使用し、他の関数は無視されることがわかります。

あなたが述べているように:*_これ以上の議論に関心を示さない」

于 2012-12-05T15:19:02.383 に答える
4

*_あなたが書くのと同じように、複数のプレースホルダーを意味し、追加の引数のリストであるdef my_callbacK_handler(a, b, _,_,_....,_):という名前の変数を作成します_

これには2つの利点があります。

  1. 余計な引数がない場合にも対応できます
def f(): 
   return 1,2,3 

def g(): 
   return 1,2

def h(): 
   return 1,2,3,4

_プレースホルダーは1つの値しか処理できないため

x,y,_ = g() # ValueError: not enough values to unpack (expected 3, got 2)

x,y,_ = h() # ValueError: too many values to unpack (expected 3)

一方*_、任意の量の値を処理できます

x,y,*_ = g()                                                                                                                  

print(_)                                                                                                                      
[]

x,y,*_ = h()                                                                                                                  

print(_)                                                                                                                      
[3, 4]

一言:*_より堅牢なコードを優先します。

于 2021-04-07T15:42:40.517 に答える
0

例を追加しましょう:

>>> *_, a = [1,2,3]
>>> _, a
([1, 2], 3)


>>> _, a = [1,2,3]
Traceback (most recent call last):
  File "<console>", line 1, in <module>
ValueError: too many values to unpack (expected 2)
于 2021-12-07T21:20:48.337 に答える