Python 展开元组/列表时不需要的部分
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)。我定义这两个变量只是为了打开第二个变量,因为我不需要另一个 因此,我的问题是:有没有一种方法可以告诉解释器打开元组,但不分解第一
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: