Это ложное срабатывание 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?

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


person julienc    schedule 17.11.2016    source источник


Ответы (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
person Łukasz Rogalski    schedule 17.11.2016
comment
Так что это точно так же, как выполнение for item in items: flatten_items.append(item[0]), но в этом случае я не получаю никаких ошибок или предупреждений от pyflakes. Почему? - person julienc; 17.11.2016
comment
может у них просто нет чекера для него? Я не знаком с инструментом хлопья - person Łukasz Rogalski; 17.11.2016