2016-11-17 6 views
2

У меня есть функция, которая может быть упрощено до этого образца кода:Является ли это ложным положительным, или я действительно что-то не так?

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?

Итак, это ложный позитив, или я действительно нахожу очень плохой код?

ответ

2

Понимание списка в 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 
+0

Так что это точно так же, как делает 'для элемента элементов: flatten_items.append (пункт [0])', но в этом Я не получаю никаких ошибок или предупреждений от pyflakes. Зачем? – julienc

+0

Может быть, у них просто нет шашки? Я не знаком с инструментом для хлопьев –