为什么Pylint不喜欢内置函数?

时间:2010-08-25 18:37:37

标签: python list-comprehension pylint

我有这样一句话:

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?

4 个答案:

答案 0 :(得分:92)

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

此页面http://pylint-messages.wikidot.com/messages:w0141表示问题在于过滤器和地图已被列表推导取代。

pylintrc文件中的这样一行会使警告变得安静:

disable=W0141

答案 1 :(得分:9)

  

为什么?列表理解是推荐的方法吗?

the tutorial example中建议使用列表理解,其中包含

  

它更简洁,更易读。

以及大多数回答者Python List Comprehension Vs. Map it is

    如果您每次定义filter
  1. 更有效使用列表理解而不是lambda
  2. 如果函数是预定义的,
  3. 可能更具可读性(效率相似)使用filter
  4. 如果您需要使用filtermap
    • 地图map
    • 咖喱map
    • 使用函数式编程
  5. TL; DR:在大多数情况下使用列表理解

答案 2 :(得分: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

答案 3 :(得分:0)

我对我的项目也有同样的警告。我将源代码更改为与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函数,授予return总是物化列表,两个python版本的结果相同

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

3-使用lfilter,这是将来的程序包导入。它总是返回一个列表,在py2上使用filter,在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即将停用。