这是 flake8 误报,还是我真的做错了什么?
Is this a flake8 false positive, or am I really doing something wrong?
我有一个函数可以简化为这个代码示例:
def test_fun():
for i in range(17):
item = i
print(item)
for i in range(42):
items = [[i], [i], [i]]
flatten_items = [item[0] for item in items]
print(flatten_items)
当我 运行 pyflakes (1.3.0) 或 flake8 (3.2.0) 时,我得到以下报告:
/tmp/test.py:7:38: F812 list comprehension redefines 'item' from line 3
我看到的是 item
变量确实被使用了两次,但是在不同的范围下,所以应该不会被报告吧?
此外,即使没有第二个循环,为什么我不应该被允许重写 item
变量,因为我已经完成了我在第 3 行定义的变量,因为 print
?
那么,这是一个误报,还是我真的写了一段很糟糕的代码?
Python 2.7 中的列表理解将局部变量泄漏到封闭范围。
>>> import sys; sys.version_info
sys.version_info(major=2, minor=7, micro=12, releaselevel='final', serial=0)
>>> [item for item in ['a', 'b', 'c']]
['a', 'b', 'c']
>>> item
'c'
此行为已在 Python 3:
中修复
>>> import sys; sys.version_info
sys.version_info(major=3, minor=5, micro=2, releaselevel='final', serial=0)
>>> [item for item in ['a', 'b', 'c']]
['a', 'b', 'c']
>>> item
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'item' is not defined
我有一个函数可以简化为这个代码示例:
def test_fun():
for i in range(17):
item = i
print(item)
for i in range(42):
items = [[i], [i], [i]]
flatten_items = [item[0] for item in items]
print(flatten_items)
当我 运行 pyflakes (1.3.0) 或 flake8 (3.2.0) 时,我得到以下报告:
/tmp/test.py:7:38: F812 list comprehension redefines 'item' from line 3
我看到的是 item
变量确实被使用了两次,但是在不同的范围下,所以应该不会被报告吧?
此外,即使没有第二个循环,为什么我不应该被允许重写 item
变量,因为我已经完成了我在第 3 行定义的变量,因为 print
?
那么,这是一个误报,还是我真的写了一段很糟糕的代码?
Python 2.7 中的列表理解将局部变量泄漏到封闭范围。
>>> import sys; sys.version_info
sys.version_info(major=2, minor=7, micro=12, releaselevel='final', serial=0)
>>> [item for item in ['a', 'b', 'c']]
['a', 'b', 'c']
>>> item
'c'
此行为已在 Python 3:
中修复>>> import sys; sys.version_info
sys.version_info(major=3, minor=5, micro=2, releaselevel='final', serial=0)
>>> [item for item in ['a', 'b', 'c']]
['a', 'b', 'c']
>>> item
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'item' is not defined