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

Python 展开元组/列表时不需要的部分,python,variable-assignment,pylint,Python,Variable Assignment,Pylint,Python就是要编写漂亮的代码。因此,我运行pylint检查代码的“美观性”,这时我碰到了一些东西: 未使用的变量“myvar1” 从我的代码的这一部分: for myvar1, myvar2 in mylist: # Do stuff just using myvar2 mylist是一个元组列表,因此我将元组展开为两个变量(myvar1和myvar2)。我定义这两个变量只是为了打开第二个变量,因为我不需要另一个 因此,我的问题是:有没有一种方法可以告诉解释器打开元组,但不分解第一

Python就是要编写漂亮的代码。因此,我运行
pylint
检查代码的“美观性”,这时我碰到了一些东西:

未使用的变量“myvar1”

从我的代码的这一部分:

for myvar1, myvar2 in mylist:
    # Do stuff just using myvar2
mylist
是一个元组列表,因此我将元组展开为两个变量(
myvar1
myvar2
)。我定义这两个变量只是为了打开第二个变量,因为我不需要另一个

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

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

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

注意:我知道这可能是我所问问题的一个选项:

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

但这远没有那么好读。

你试过这两种吗

for _, myvar in mylist:
    #Do stuff

在Python中运行良好,并且相对来说比较惯用。

我想您可以这样做:

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

但坦率地说,我认为在这种情况下,您应该忽略pylint警告——它足够漂亮,不会引起任何混乱(这就是为什么您首先要美观的原因)。

我想说,Python是关于编写可读代码的——任何“美观”都只是一个副作用

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

for myvar2 in zip(*mylist)[1]:
    # Do stuff with myvar2
但我不确定我真的会推荐它。就我个人而言,我只会使用:

for myvar1, myvar2 in mylist:
    # Do stuff with myvar2
。。。忽略派林

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

for x,x in tu:
    print x
结果

sea
badada
zut

! 当我想强调只使用myvar2时,我在mylist中为myvar2编写了

当我想提醒读者(通常是我)记录结构是什么时,我会在mylist中为myvar1、myvar2编写

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

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

>>> 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抱怨。正如Francis Avila指出的,pylint不应该在这种情况下抱怨

除了@RaymondHettinger的答案之外:如果未使用的变量的名称以一个下划线开头,pylint也不会抱怨未使用的变量。这意味着您可以使用:

for _myvar1, myvar2 in mylist:
充分利用这两个世界:

  • 没有派林警告
  • 以及有关记录结构的信息

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

是的,它确实有效。但它实际上是将元组的第一个值赋给变量
,这不是我问题的想法。好吧,你已经列出了你的选项,我想说这是最“漂亮”的。正如您所说的,其他选项更详细,更不容易理解。Pylint是一个很好的工具,但它并不是追求代码美的终极目标(不管这意味着什么)。对我来说,这是一个完美的习惯用法。我想你是对的。我问这个问题并不是因为我想避免出现
pylint
警告,而是出于好奇最终给出了一个合理的答案,这不是最好的做法,但至少回答了我的问题。这似乎比使用不同的变量名要不美观和清晰得多,而且只有在您想忽略左侧的项时才起作用。您是否可以在不测试代码的情况下自动知道哪个项目绑定到
x
?事实上,这是派林应该抓住的东西。@Francis Avila我不是不高兴,我只是非常惊讶。关于你的观点,顺便问一下,你称之为“指定行为”是什么?它与“实现”的区别是什么?这个答案不是一个好的模型。许多读者会感到困惑。它不会通过大多数代码审查。请对此答案进行向下投票。这既丑陋又邪恶,在我工作的地方无法通过代码审查,因为它会带来可维护性问题。pylint也不会抱怨名称以单下划线开头的未使用参数。这意味着您可以使用“for_myvar1,myvar2 in mylist”,充分利用这两个方面:无pylint警告和有关记录结构的信息。我将添加此评论作为答案@gurney alex,因为我认为这是最好的。@gurneyalex这是一个非常好的观察结果,我将对此进行研究。@FrancisAvila,我就是这么做的。这意味着使用
\uuu
也没有Pylint警告?如果Pylint变量的名称以
unused\uu
开头(字面意思),它似乎不会抱怨unused变量。例如,
对于mylist中未使用的\u myvar1、myvar2:
。相关问题的前缀
未使用的
如中所述。
for _myvar1, myvar2 in mylist: