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

4

阅读了这个问题后,我能理解为什么会输出这个警告,但我有一个特定的情况,循环变量不能未定义...

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

print i 

我对上述进行PyLint检查,得到以下结果:

 W:  4,6: Using possibly undefined loop variable 'i'
< p > PyLint难道没有足够聪明的能力来注意到这种情况下内置的range()函数将总是产生一个已填充的列表,因此i将始终为最后一个print语句设置吗?如果它是一个未定义的函数,我可以理解,因为 PyLint不可能知道函数的作用... 但在这种情况下,这是一个众所周知的函数,这种用法肯定很常见吧?

如果是这样的话,是抑制警告更好还是在循环之前定义i(这似乎是浪费的)?


2
如果你在代码中重新定义了 range,会发生什么呢? - tobias_k
好的,谢谢你的回复。 - Jimbo
1个回答

7
这是因为根据执行步骤的中间过程,您的范围可能为空,或者可能在代码中被重新定义,如 @tobias_k 所指出的(尽管这会抛出一个附加的 W: 1, 0: Redefining built-in 'range' (redefined-builtin)),因此变量 i 可能未定义。
请注意,pylint 根本不执行代码,它只进行静态分析,因此它不会检查范围内的值。因此,当它看到在 for 块中定义的变量可能超出作用域而被重复使用时,它会抱怨。
考虑以下示例,其中 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

作为对您问题的回答,是不是更好地抑制警告,我的答案将是不。如果您确实想要抑制它,请确保在涉及到的代码块之后重新启用它。

2
好的,谢谢。所以这是因为PyLint不检查range函数(我明白它可能返回一个空列表 - 在我的特定情况下它没有),或者其他内置函数来解决它。谢谢。 - Jimbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接