繁体   English   中英

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

[英]Why doesn't Pylint like built-in functions?

我有这样一行:

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?

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

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

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

disable=W0141

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

建议在示例中使用列表理解

它更加简洁易读。

以及大多数回答者都对SO的Python列表理解能力进行了比较。 地图在那里它是

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

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

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

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

禁用它:

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

我对我的项目也有同样的警告。 我将源代码更改为与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上使用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即将停用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM