¿Por qué no lo hace Pylint como funciones integradas?
-
01-10-2019 - |
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?
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
- más eficiente para utilizar la lista de la comprensión de
filter
si está definiendo unalambda
cada vez - quizá más legible (y con una eficacia similar) para utilizar
filter
si la función está predefinido - necesario el uso de
filter
ymap
si- Mapa
map
, - curry de
map
, o - utilizar la programación funcional
- Mapa
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.