【问题标题】:Why doesn't Pylint like built-in functions?为什么 Pylint 不喜欢内置函数?
【发布时间】:2011-04-03 21:43:11
【问题描述】:

我有这样一行:

filter(lambda x: x == 1, [1, 1, 2])

Pylint 显示警告:

W:  3: Used builtin function 'filter'

这是为什么呢?列表推导是推荐的方法吗?

当然我可以这样重写:

[x for x in [1, 1, 2] if x == 1]

我没有收到任何警告,但我想知道这是否有 PEP?

【问题讨论】:

  • 有趣的是,当我使用内置函数 map 时,pylint 不喜欢,但是当我从 cytoolz 导入 map 函数来使用它时,它也不喜欢。

标签: python list-comprehension pylint


【解决方案1】:

我的项目也收到了同样的警告。我正在将源代码更改为兼容 py2/3,pylint 有很大帮助。

运行 pylint --py3k 仅显示有关兼容性的错误。

在python 2中,如果使用filter,它会返回一个list

>>> my_list = filter(lambda x: x == 1, [1, 1, 2])
>>> my_list
[1, 1]
>>> type(my_list)
<type 'list'>

但在 python 3 中,filter 和其他类似方法(maprangezip、..)返回一个迭代器,它是不兼容的类型,可能会导致代码中的错误。

>>> my_list = filter(lambda x: x == 1, [1, 1, 2])
>>> my_list
<filter object at 0x10853ac50>
>>> type(my_list)
<class 'filter'>

为了使您的代码兼容 python 2/3,我使用了来自 python future site 的备忘单

为避免此警告,您可以使用 4 种适用于 python 2 和 3 的方法:

1 - 使用你所说的列表理解。

2 - 使用list 函数,授予返回总是一个物化列表,两个python版本的结果相同

>>> list(filter(lambda x: x == 1, [1, 1, 2]))
[1, 1]

3 - 使用lfilter,这是未来的包导入。它总是返回一个列表,在 py2 上使用过滤器,在 py3 上使用list(filter(..)。因此,两个 python 的行为相同,并且语法更简洁。

>>> from future.utils import lfilter
>>> lfilter(lambda x: x == 1, [1, 1, 2])
[1, 1]

4 - 最好的!始终在循环中使用 filter,这样 pylint 不会发出警告,并且它在 python 3 上具有很好的性能提升。

>>> for number in filter(lambda x: x == 1, [1, 1, 2]):
>>>     print(number)
>>> 1
>>> 1

总是更喜欢在 python 3 上工作的函数,因为 python 2 很快就会被淘汰。

【讨论】:

    【解决方案2】:

    这是为什么呢?列表推导是推荐的方法吗?

    the tutorial example 建议使用列表理解

    更简洁易读。

    大多数回答者都在 SO 的 Python List Comprehension Vs. Map 那里it is

    1. 如果您每次都定义一个 lambda,那么使用列表理解比 filter 更有效
    2. 如果函数是预定义的,使用filter 可能更具可读性(并且效率相似)
    3. 如果您需要使用filtermap
      • 映射map,
      • 咖喱map,或者
      • 使用函数式编程

    TL;DR:在大多数情况下使用列表推导

    【讨论】:

      【解决方案3】:

      Pylint 经常喋喋不休地谈论不该谈论的事情。您可以在 .pylintrc 文件中禁用警告。

      此页面http://pylint-messages.wikidot.com/messages:w0141 表示问题在于过滤器和映射已被列表理解取代。

      在你的 pylintrc 文件中这样一行将使警告消失:

      disable=W0141
      

      【讨论】:

      • 我也不知道。我用“-i y”标志运行 pylint 以包含消息号,然后我用谷歌搜索“pylint W0141”,这就是我发现的。
      • @NedBatchelder:谢谢!您最终还应该添加标题[MESSAGES CONTROL](请参阅.pylintrc example),因为刚刚创建此文件的人不知道这是必要的。
      • 考虑使用更长、更易读的消息名称来禁用此功能:# pylint: disable=bad-builtin。或者在 pylintrc 中:[MESSAGES CONTROL] disable=bad-builtin。更清楚的是只是一个警告号。
      【解决方案4】:

      我遇到了同样的问题,无法弄清楚

      为什么内置函数 `input' 不好。我是你打算

      禁用它:

      pylint --bad-functions="[map,filter,apply]" YOUR_FILE_TO_CHECK_HERE

      一旦你喜欢这些设置:

      pylint --bad-functions="[map,filter,apply]" --some-other-supercool-settings-of-yours
      --generate-rcfile > test.rc
      

      验证您的设置是否在文件中,例如:

      cat test.rc | grep -i YOUR_SETTING_HERE
      

      之后就可以在本地使用这个文件了

      pylint --rcfile test.rc --your-other-command-line-args ...
      

      甚至可以将其用作您的默认 rcfile。为此,我请您参考

      pylint --long-help
      

      【讨论】:

      • 在 python2 中,input() 是邪恶的,因为它确实是 eval(raw_input())。您应该始终使用raw_input()。在 python3 中,input() 具有所需的行为(总是返回 str)。
      猜你喜欢
      • 2011-09-14
      • 2015-08-06
      • 2021-10-15
      • 2016-11-04
      • 2012-10-25
      • 2019-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多