我有这样一行:
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?
Answers:
皮林特(Pylint)经常闲聊一些不该做的事情。您可以在.pylintrc文件中禁用警告。
此页面http://pylint-messages.wikidot.com/messages:w0141指示问题在于过滤器和映射已被列表推导取代。
pylintrc文件中的这样的行将使警告静默:
disable=W0141
[MESSAGES CONTROL]
(请参见.pylintrc示例),因为刚创建此文件的人员可能不知道这是必需的。
# pylint: disable=bad-builtin
。或在pylintrc中:[MESSAGES CONTROL] disable=bad-builtin
。更清楚的是,只是一个警告数字。
这是为什么?列表理解是推荐的方法吗?
列表理解,建议在教程示例,其中规定
它更加简洁易读。
以及大多数回答者都对SO的Python列表理解能力提出了要求。地图在那里它是
filter
您lambda
每次定义列表相比,使用列表理解更有效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
input()
它是邪恶的,因为它确实如此eval(raw_input())
。您应该始终使用raw_input()
。在python3中,input()
具有所需的行为(始终返回str
)。
我对我的项目也有同样的警告。我将源代码更改为与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和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即将停用。
map
,但也不喜欢导入map
函数cytoolz
以使用它。