PyLint:使用可能未定义的循环变量警告
PyLint: Using possibly undefined loop variable warning
读过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
更好(这看起来很浪费)?
这是因为根据所涉及的中间执行步骤,您的范围可能为空,或者它可能已在@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
作为您问题的答案,是否最好取消警告,我的回答是否定的。如果您确实想禁止它,请确保在有问题的代码块之后重新启用它。
读过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
更好(这看起来很浪费)?
这是因为根据所涉及的中间执行步骤,您的范围可能为空,或者它可能已在@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
作为您问题的答案,是否最好取消警告,我的回答是否定的。如果您确实想禁止它,请确保在有问题的代码块之后重新启用它。