web-dev-qa-db-ja.com

Python関数呼び出しで未使用の戻りパラメーターに使用するスタイル

関数が値のタプルを返すが、それらの値の1つだけが後で使用される状況を処理するための推奨される/一般的に受け入れられているコーディングスタイルはありますか?電話はおそらくやり過ぎです...)?する代わりに

a, b, c = foo()

次に、bcを使用しないだけです。次のバリアントのうち、どちらを優先するべきですか(または別のバリアントはありますか?):

バリエーション1(アンダースコア)

a, _, _ = foo()

(これは非常に明確でシンプルですが、_ = gettext.gettext翻訳を使用する多くのアプリケーションで使用されます)

バリエーション2(仮名)

a, unused, unused = foo()

(あまり魅力的ではないと思いますが、dummyのような他の名前でも同じです)

バリアント3(インデックス)

a = foo()[0]

(私には()[0]はPythonicでないように見えます…)

31
user49643

未使用の変数にアンダースコアを使用することは間違いなく許容されます。ただし、一部のコードベースでは、識別子がgettextの省略形として予約されているため、これはオプションではありません。これは、このスタイルに対する最も頻繁な反対です(ただし、私が判断できる限り、それは大多数にとって問題ではありません)。私はまだそれをお勧めし、常に自分で使用します。

dummyunusedのような名前は私を個人的に苛立たせる傾向があり、私はそれほどひどく目にすることはありません(Pythonでは、つまり-dummyを使用するDelphiコードベースを知っています自由に、そしてそれはまた、問題のプログラムに関連するスクリプトにリークされています)。私はそれに対してあなたに助言します。

返されたタプルから1つのアイテムを抽出するだけでも大丈夫です。また、未使用の値の数を正しく取得する手間も省けます。ただし、2つの潜在的な欠点があることに注意してください。

  • 値の数が期待したものと異なっていても、爆発しません。このmayは、取り違えやタイプミスを検出するのに役立ちます。
  • これは、戻り値がシーケンスである場合にのみ機能します(ほとんどの場合はタプルとリストですが、一般的なままです)。手短に言えば、反復可能で一定数の値を生成する(したがって、アンパック割り当てで使用できる)コード内の1つのクラス(2Dベクトル)を知っていますが、インデックス化できません。
17
user7043

Pylintは、このようにすることを習慣にしています。

widget, _parent, _children = f()

つまり、未使用の結果には、接頭辞_が付いた説明的な名前が付けられます。 Pylintは、_で始まるローカルを未使用と見なし、_で始まるグローバルまたは属性をプライベートと見なします。

22
Vincent Povirk

他の人が言ったように、アンダースコア(___)が標準です。しかし、アンダースコアが翻訳に使用されている場合、二重のアンダースコアが最良の代替案だと思います。

var, __, value = "VAR=value".partition('=')

これらより良い:

var, unused, value = "VAR=value".partition('=')

var, unused_del, value = "VAR=value".partition('=')

var, _del, value = "VAR=value".partition('=')

3
Rick Mohr

プロジェクト全体でこれを1回だけ行う場合、または特定の関数に対して非常にまれに行う場合、gettextがそのモジュールの問題ではない場合はVariant 1を使用し、それ以外の場合はVariant 3を使用します。

一方、これを頻繁に行っていた場合-特に毎回、戻り値のdifferentサブセットが必要な場合(ラッパーをあなたが気にしないものを返すだけです)、結果を 名前付きタプル に入れるラッパー、または他の記述クラスのインスタンスを書くことは有益かもしれません:

bar = foo()

そして、bar.abar.bおよびbar.c

3
lvc

私は非Pythonプログラマーですが、私にとって3番目のバリアントが最も理にかなっています。

バリアント3では、どの値を処理することに関心があるかが明確になります。バリアント1と2では、値を変数に代入して戻すため、それらを使用できます。あいまいな名前を付けた可能性がありますが、不適切な名前付けは実際には問題の解決策ではありません。

明快さはさておき、なぜメモリのスロットに未使用の値を割り当てたいのですか(バリアント1と2のように)?これは、メモリ管理の点で貧弱なソリューションになります。

1
Craige