我有这样一句话:
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?
答案 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
,lambda
filter
filter
和map
map
,map
或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
和其他类似方法(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 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即将停用。