6

Pythonとは、美しいコードを書くことです。それで、pylint何かにぶつかったとき、私は自分のコードの「美しさ」をチェックするために走っていました。

未使用の変数'myvar1'

私のコードのこの部分から:

for myvar1, myvar2 in mylist:
    # Do stuff just using myvar2

mylistはタプルのリストなので、タプルを2つの変数(myvar1myvar2)にアンラップしています。もう一方は必要ないので、2番目の変数をアンラップするためだけにこれらの2つの変数を定義しています。

だから、ここに私の質問があります:タプルをアンラップするようにインタプリタに指示する方法はありますが、最初の部分を評価しないでください(たとえば)。他のいくつかの言語では、次のようなことができます。

for _, myvar in mylist:
    # Do stuff with myvar

また

for *, myvar in mylist:
    # Do stuff with myvar

つまり、タプルの最初の部分は気にせず、2番目の部分が必要です。

注:これは私が求めているもののオプションになる可能性があることを私は知っています:

for mytuple in mylist:
    # Do stuff with mytuple[1]

しかし、それははるかに読みにくいです。

4

6 に答える 6

11

@RaymondHettingerの回答に加えて、Pylintは、名前が単一の下線で始まる場合、未使用の変数についても文句を言いません。これは、次を使用できることを意味します。

for _myvar1, myvar2 in mylist:

両方の世界を最大限に活用する:

  • ピリント警告なし、
  • およびレコード構造に関する情報

これは関数/メソッドのプロトタイプでも機能し、OOフレームワークの基本クラスから派生するときによく発生する未使用のパラメーターに関する警告を回避します。

于 2011-12-04T20:04:21.880 に答える
3

これらのいずれかを試しましたか?

for _, myvar in mylist:
    #Do stuff

Pythonで正常に動作し、比較的慣用的です。

于 2011-12-02T20:00:40.877 に答える
3

myvar2for _, myvar2 in mylistのみが使用されていることを強調したいときに書きます。

for myvar1, myvar2 in mylistそして、読者(通常は私)にレコード構造が何であるかを思い出させたいときに書きます。

この_名前は、使い捨ての値の命名規則にすぎません。CPythonインタープリターは、他の変数名の場合と同じように変数の割り当てを行います(幸い、* STORE_FAST *は非常に安価な操作です)。対照的に、PyPyインタープリターは、未使用の変数割り当てをデッドコードとして識別するため、記述方法に関係なく、無料で最適化を取得できます。

CPythonがコードをどのように解釈するかについて知りたい場合は、disモジュールが有用な洞察を提供します。

>>> from dis import dis
>>> def f(lot):
        for _, var2 in lot:
            print var2


>>> dis(f)
  2           0 SETUP_LOOP              25 (to 28)
              3 LOAD_FAST                0 (lot)
              6 GET_ITER            
        >>    7 FOR_ITER                17 (to 27)
             10 UNPACK_SEQUENCE          2
             13 STORE_FAST               1 (_)
             16 STORE_FAST               2 (var2)

  3          19 LOAD_FAST                2 (var2)
             22 PRINT_ITEM          
             23 PRINT_NEWLINE       
             24 JUMP_ABSOLUTE            7
        >>   27 POP_BLOCK           
        >>   28 LOAD_CONST               0 (None)
             31 RETURN_VALUE 

他のポスターが述べているように、pylintからの警告は時々狂気になることがあります。コードで短い変数名を使用したい場合は、pylintの苦情を無視してください。フランシス・アビラが指摘したように、ピリント_はこの文脈で文句を言うべきではありません。

于 2011-12-02T23:13:38.773 に答える
2

私はあなたがこれを行うことができると思います:

for myvar in (t[1] for t in mylist):
    pass

しかし率直に言って、この場合はピリントの警告を無視する必要があると思います-それは十分に美しく、混乱を引き起こしません(それがあなたが最初に美しさを望む理由です)。

于 2011-12-02T20:25:19.310 に答える
2

Pythonは、読み取り可能なコードを書くことがすべてだと思います。「美しさ」は単なる副作用です。

タプルの最初の項目は、次のように削除できます。

for myvar2 in zip(*mylist)[1]:
    # Do stuff with myvar2

しかし、私が本当にそれをお勧めするかどうかはわかりません。個人的に私はただ使用します:

for myvar1, myvar2 in mylist:
    # Do stuff with myvar2

...そしてpylintを無視します。

于 2011-12-02T20:39:18.003 に答える
-1
tu = [(12,'sea'),(478,'badada'),(789,'zut')]

for x,x in tu:
    print x

結果

sea
badada
zut

于 2011-12-02T21:22:22.377 に答える