2016-11-17 135 views
2

我有一個可以簡化這個代碼示例的函數:這是一個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

那麼,這是一個誤報,還是我真的寫了一段非常糟糕的代碼?

回答

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

也許他們根本沒有檢查器?我不熟悉片狀工具 –

相關問題