[英]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列表理解能力进行了比较。 地图在那里它是
lambda
,使用列表理解比使用filter
更有效 filter
可能更具可读性 (并且具有类似的效率) filter
和map
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
和其他类似方法( map
, range
, zip
,..)返回一个迭代器,该迭代器的类型不兼容,并可能导致代码中的错误。
>>> 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.