Why doesn't Pylint like built-in functions?

后端 未结 4 1944
感动是毒
感动是毒 2020-12-08 03:30

I have a line like this:

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

Pylint is showing a warning:

W:  3: Used builtin function \'fi         


        
4条回答
  •  感动是毒
    2020-12-08 04:30

    I've got the same warning on my project. I'm changing the source code to be py2/3 compatible, and pylint helps a lot.

    Running pylint --py3k shows only errors about compatibility.

    In python 2, if use filter, it returns a list:

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

    But in python 3, filter and other similar methods (map, range, zip, ..) return a iterator, that is incompatible types and perhaps cause bugs in your code.

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

    To make your code python 2/3 compatible, I use a cheat sheet from python future site

    To avoid this warning, you can use 4 approaches, that works on python 2 and 3:

    1 - Using a list comprehension like you said.

    2 - Using a list function, grant that return always is a materialized list, result is same on both python versions

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

    3 - Using lfilter, that's a future package import. It always return a list, uses filter on py2, and list(filter(..) on py3. So, both pythons got the same behaviour and you got a cleaner syntax.

    >>> from future.utils import lfilter
    >>> lfilter(lambda x: x == 1, [1, 1, 2])
    [1, 1]
    

    4 - The best! Use filter always on a loop, this way pylint don't give warnings, and it have a nice performance boost on python 3.

    >>> for number in filter(lambda x: x == 1, [1, 1, 2]):
    >>>     print(number)
    >>> 1
    >>> 1
    

    Always prefer functions that works on python 3, because python 2 will be retired soon.

提交回复
热议问题