2016-11-17 23 views
2

私はこのコードサンプルに単純化することができる機能があります。これはflake8の偽陽性ですか、それとも本当に間違っていますか?

/tmp/test.py:7:38: F812 list comprehension redefines 'item' from line 3 
:私はpyflakes(1.3.0)またはflake8(3.2.0)を実行すると

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) 

、私は以下のレポートを取得します

私が見るところでは、item変数は実際には2回使用されていますが、異なるスコープで使用されるため、報告しないでください。

から3行目で定義した変数との作業が終了したため、2番目のループがなくても、item変数を書き直すことを許可しないでください。

これは偽陽性ですか、それとも本当に貧弱なコードを書いていますか?

答えて

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

多分彼らは単にそれのためのチェッカーを持っていない?私はフレークツールに慣れていない –

関連する問題