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 *, myvar in mylist:
# Do stuff with myvar
这意味着:我不关心元组的第一部分,我只需要第二部分。
注意:我知道这可能是我要问的选项:
for mytuple in mylist:
# Do stuff with mytuple[1]
但那可读性差得多。
答案 0 :(得分:6)
除了@ RaymondHettinger的回答:如果他们的名字以单个下划线开头,Pylint也不会抱怨未使用的变量。这意味着您可以使用:
for _myvar1, myvar2 in mylist:
充分利用这两个方面:
这也适用于函数/方法原型,并避免了有关未使用参数的警告,这些参数在从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