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


74

我有这样一行:

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?


1
有趣的是,pylint不喜欢使用内置函数map,但也不喜欢导入map函数cytoolz以使用它。
bli

Answers:


95

皮林特(Pylint)经常闲聊一些不该做的事情。您可以在.pylintrc文件中禁用警告。

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

pylintrc文件中的这样的行将使警告静默:

disable=W0141

6
我也不知道。我用“ -i y”标志运行pylint以包括消息号,然后我用Google搜索了“ pylint W0141”,这就是我发现的结果。
Ned Batchelder

1
@NedBatchelder:谢谢!您最终还应该添加标头[MESSAGES CONTROL](请参见.pylintrc示例),因为刚创建此文件的人员可能不知道这是必需的。
Martin Thoma 2014年

3
考虑使用更长,更易读的消息名称禁用此功能# pylint: disable=bad-builtin。或在pylintrc中:[MESSAGES CONTROL] disable=bad-builtin。更清楚的是,只是一个警告数字。
johntellsall

10

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

列表理解,建议在教程示例,其中规定

它更加简洁易读。

以及大多数回答者都对SO的Python列表理解能力提出了要求。地图在那里它是

  1. filterlambda每次定义列表相比,使用列表理解更有效
  2. 如果该函数是预定义的,则可能使用起来更具可读性(并具有类似的效率)filter
  3. 有必要使用filtermap如果你
    • 地图map
    • 咖喱map,或
    • 使用函数式编程

TL; DR:在大多数情况下使用列表理解


5

我遇到了同样的问题,无法解决

内置函数“输入”为什么不好。我你打算

禁用它:

pylint --bad-functions =“ [地图,过滤器,应用]” 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

4
在python2中,input()它是邪恶的,因为它确实如此eval(raw_input())。您应该始终使用raw_input()。在python3中,input()具有所需的行为(始终返回str)。
mic_e

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未来网站的备忘单

为了避免出现此警告,您可以使用4种方法,这些方法适用于python 2和3:

1-像您说的那样使用列表理解。

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

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

3-使用lfilter,这是将来的程序包导入。它总是返回一个列表,在py2和list(filter(..)py3上使用过滤器。因此,两个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即将停用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.