展开元组/列表时不需要的部分

时间:2011-12-02 19:58:27

标签: python variable-assignment pylint

Python就是编写漂亮的代码。所以,当我碰到某些东西时,我正在运行pylint检查我的代码的“漂亮”:

  

未使用的变量'myvar1'

从我的代码的这一部分:

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

mylist是一个元组列表,因此我将元组展开为两个变量(myvar1myvar2)。我正在定义这两个变量只是为了解开第二个变量,因为我不需要另一个变量。

所以,这是我的问题:有没有办法告诉解释器打开元组,但不能解释第一部分(例如)。在其他一些语言中,您可以执行以下操作:

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

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

这意味着:我不关心元组的第一部分,我只需要第二部分。

注意:我知道这可能是我要问的选项:

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

但那可读性差得多。

6 个答案:

答案 0 :(得分:6)

除了@ RaymondHettinger的回答:如果他们的名字以单个下划线开头,Pylint也不会抱怨未使用的变量。这意味着您可以使用:

for _myvar1, myvar2 in mylist:

充分利用这两个方面:

  • 没有Pylint警告,
  • 以及有关记录结构的信息

这也适用于函数/方法原型,并避免了有关未使用参数的警告,这些参数在从OO框架中的基类派生时通常可以获得。

答案 1 :(得分:3)

您是否尝试过其中任何一种?

for _, myvar in mylist:
    #Do stuff

在Python中运行良好,并且相对惯用。

答案 2 :(得分:3)

当我想强调只使用 myvar2 时,我写for _, myvar2 in mylist

当我想提醒读者(通常是我)记录结构是什么时,我写for myvar1, myvar2 in mylist

_名称只是一个抛弃值的命名约定。 CPython解释器为它做变量赋值就像使用任何其他变量名一样(幸运的是,* STORE_FAST *是一个非常便宜的操作)。相反,PyPy interpreter会将未使用的变量赋值标识为死代码,因此无论您如何编写它都可以免费获得优化。

如果您对CPython如何解释代码感到好奇,dis module可以提供有用的见解:

>>> 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投诉。正如Francis Avila指出的那样,在这种背景下,pylint不应该抱怨_

答案 3 :(得分:2)

我想你可以这样做:

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

但坦率地说,我觉得你应该忽略这种情况下的幽灵警告 - 它很漂亮,不会造成任何混淆(这就是为什么你想要美丽的原因)。

答案 4 :(得分:2)

我会说Python就是编写可读代码 - 任何“美丽”只是一种副作用。

元组的第一项可以像这样删除:

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

但我不确定我是否真的推荐它。就个人而言,我只会使用:

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

...并忽略pylint。

答案 5 :(得分:-1)

tu = [(12,'sea'),(478,'badada'),(789,'zut')]

for x,x in tu:
    print x

结果

sea
badada
zut

<!/ H2>