展开tuple/lis时不需要的部件

2024-09-27 07:20:24 发布

您现在位置:Python中文网/ 问答频道 /正文

Python就是写漂亮的代码。所以,我在运行pylint来检查我的代码是否“漂亮”,这时我遇到了一些问题:

Unused variable 'myvar1'

从我的代码的这一部分:

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

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

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

^{pr2}$

或者

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

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

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

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

但这是远远不够可读的。在


Tags: 代码inforunusedwithvariabledopylint
3条回答

你试过这两种吗?在

for _, myvar in mylist:
    #Do stuff

在Python中可以很好地工作,并且相对来说是惯用的。在

我写for _, myvar2 in mylist是为了强调只使用了myvar2。在

当我想提醒读者(通常是我)记录结构是什么的时候,我写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投诉。正如弗朗西斯·阿维拉指出的,在这种情况下,皮林不应该抱怨{}。在

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

for _myvar1, myvar2 in mylist:

两全其美:

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

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

相关问题 更多 >

    热门问题