PyLint:使用可能未定义的循环变量警告

时间:2015-03-27 10:59:59

标签: python pylint

阅读this question我可以理解为什么可能输出这个警告,但我有一个特定的情况,当循环变量不能被定义...

for i in range(0, 2):
    print i

print i 

上面的PyLinting我得到了

 W:  4,6: Using possibly undefined loop variable 'i'

PyLint不够聪明,注意内置 range()函数会在这种情况下生成一个填充列表,因此i将永远是设置为上一个print语句?我可以理解它是否是一个定义不足的函数,因为PyLint不可能知道函数的作用......但在这种情况下它是一个众所周知的函数,当然这种用法会很常见吗?

如果是这样,最好是在循环之前抑制警告或定义i(这看起来很浪费)?

1 个答案:

答案 0 :(得分:7)

这是因为你的范围可能是空的,这取决于所涉及的中间执行步骤,或者它可能在代码中重新定义,如@tobias_k所指出的那样(尽管这会引发额外的W: 1, 0: Redefining built-in 'range' (redefined-builtin)),因此,可能未定义变量i

请注意pylint根本不执行代码,它只进行静态分析,因此不会检查范围内的值。因此,当它看到在一个for block中定义的变量被重用时可能超出范围时,就会抱怨。

考虑下面的示例,其中pylint显示相同的警告,但一个运行,而另一个抛出异常:

W:  4, 6: Using possibly undefined loop variable 'i' (undefined-loop-variable)

示例(不工作)

$ cat test.py 
for i in range(0):
        print i        
print i

$ python test.py 
Traceback (most recent call last):
  File "test.py", line 4, in <module>
    print i
NameError: name 'i' is not defined

示例(工作)

$ cat test.py 
for i in range(0, 2):
        print i
print i

$ python test.py 
0
1
1

作为你问题的答案,抑制警告是否更好,我的回答是否定的。如果您确实要禁止它,请确保在相关代码块之后重新启用它。