【问题标题】:Is this a flake8 false positive, or am I really doing something wrong?这是 flake8 误报,还是我真的做错了什么?
【发布时间】:2016-11-17 11:14:25
【问题描述】:

我有一个函数可以简化为这个代码示例:

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 变量,因为我已经完成了自 print 以来我在第 3 行定义的变量?

那么,这是误报,还是我真的在写一段很糟糕的代码?

【问题讨论】:

    标签: python python-2.7 list-comprehension flake8 pyflakes


    【解决方案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
    

    【讨论】:

    • 所以这与执行for item in items: flatten_items.append(item[0]) 完全相同,但在这种情况下,我没有收到任何来自 pyflakes 的错误或警告。为什么?
    • 也许他们根本没有检查器?我不熟悉 flakes 工具
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    相关资源
    最近更新 更多