Pregunta

Tengo una línea como la siguiente:

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

Pylint está mostrando una advertencia:

W:  3: Used builtin function 'filter'

¿Por qué? es una lista por comprensión del método recomendado?

Por supuesto que puedo volver a escribir esto como esto:

[x for x in [1, 1, 2] if x == 1]

Y consigo ninguna advertencia, pero me preguntaba si hay una PEP para esto?

¿Fue útil?

Solución

Pylint parlotea a menudo de por cosas que no debería. Puede desactivar la advertencia en un archivo .pylintrc.

Esta página http://pylint-messages.wikidot.com/messages:w0141 indica que el problema es que el filtro y el mapa han sido sustituidos por listas por comprensión.

Una línea como ésta en su archivo pylintrc calmará la advertencia:

disable=W0141

Otros consejos

  

¿Por qué? es una lista por comprensión del método recomendado?

Lista de comprensión se recomienda en el ejemplo del tutorial , que estados

  

es más concisa y fácil de leer.

y por la mayoría de los que responden en Lista Python Vs. Comprensión de SO Mapa donde es

  1. más eficiente para utilizar la lista de la comprensión de filter si está definiendo una lambda cada vez
  2. quizá más legible (y con una eficacia similar) para utilizar filter si la función está predefinido
  3. necesario el uso de filter y map si
    • Mapa map,
    • curry de map, o
    • utilizar la programación funcional

TL; DR: Lista de utilización de comprensión en la mayoría de los casos

me encontré con el mismo problema y no pudo averiguar

¿Por qué la entrada `' incorporado en la función es malo. Os propongo

para deshabilitarlo:

  

pylint --bad-funciones = "[mapa, el filtro, se aplica]" YOUR_FILE_TO_CHECK_HERE

Una vez que al igual que la configuración:

pylint --bad-functions="[map,filter,apply]" --some-other-supercool-settings-of-yours
--generate-rcfile > test.rc

Compruebe que la configuración se encuentran en el archivo, por ejemplo:.

cat test.rc | grep -i YOUR_SETTING_HERE

Después de que se puede utilizar este archivo localmente

pylint --rcfile test.rc --your-other-command-line-args ...

o incluso utilizarlo como su fichero de recursos por defecto. Para esto le remitimos a

pylint --long-help

Tengo la misma advertencia en mi proyecto. Estoy cambiando el código fuente para ser AP2 / 3 compatible y pylint ayuda mucho.

En ejecución muestra pylint --py3k sólo los errores acerca de la compatibilidad.

En Python 2, si el uso filter, devuelve un list:

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

Pero en Python 3, filter y otros métodos similares (map, range, zip, ..) devolver un iterador, que es tipos incompatibles y tal vez causa errores en su código.

>>> my_list = filter(lambda x: x == 1, [1, 1, 2])
>>> my_list
<filter object at 0x10853ac50>
>>> type(my_list)
<class 'filter'>

Para hacer su pitón de codificación 2/3 compatibles, utilizo una hoja de trucos de pitón futuro sitio

Para evitar esta advertencia, se puede usar 4 enfoques, que funciona en Python 2 y 3:

1 - Usando una lista por comprensión como usted dijo

.

2 - Utilizando una función list, concede que regreso siempre se materializó una lista, resultado es el mismo en ambas versiones pitón

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

3 - Usando lfilter, que es un paquete de importación futuro. Siempre devuelve una lista, utiliza el filtro de AP2 y AP3 en list(filter(..). Por lo tanto, ambos pitones consiguieron el mismo comportamiento y tienes una sintaxis más limpia.

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

4 - La mejor! Uso filter siempre en un bucle, de esta manera pylint no dar advertencias, y que tenga un buen aumento de rendimiento en Python 3.

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

Siempre prefieren funciones que funciona en Python 3, porque pitón 2 se retirará pronto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top