Это ложное срабатывание flake8 или я действительно что-то делаю не так?
У меня есть функция, которую можно упростить до этого примера кода:
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
?
Итак, это ложный позитив, или я действительно пишу очень плохой кусок кода?
1 ответ
Решение
Понимание списков в 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