2010-08-25 26 views
69

que tienen una línea como esta:¿Por qué a Pylint no le gustan las funciones incorporadas?

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

Pylint está mostrando una advertencia:

W: 3: Used builtin function 'filter' 

¿Por qué? ¿Es una lista de comprensión el método recomendado?

Por supuesto que puedo volver a escribir esto como esto:

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

Y me da ninguna advertencia, pero me pregunto si hay una PEP para esto?

+0

Curiosamente , a pylint no le gusta cuando uso la función integrada 'map', pero tampoco me gusta cuando importe la función 'map' de' cytoolz' para usar esto en su lugar. – bli

Respuesta

89

Pylint a menudo habla sobre cosas que no debería. Puede deshabilitar 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 reemplazados por la lista de comprehensiones.

una línea como la siguiente en el archivo de pylintrc calmará la advertencia:

disable=W0141 
+2

No sabía de ese sitio web, ¡muchas gracias! – igorgue

+6

Yo tampoco lo sabía. Ejecuté una lista con la bandera "-i y" para incluir el número de mensaje, luego busqué en Google "pylint W0141", y eso es lo que encontré. –

+0

Hecho, agregó una línea de muestra. –

4

me encontré con el mismo problema y no podía entender por

por qué la función incorporada en `entrada' es malo . Os propongo

para desactivarlo:

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

Una vez que al igual que los ajustes:

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

Verifique que su configuración esté 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 al

pylint --long-help 
+0

Simplemente colocando "#pylint: disable = bad-builtin" es más rápido, pero sospecho que hay alguna forma preferida de hacer la entrada desde el flujo de entrada estándar que está escondido en algún lugar profundo si está documentado. –

+1

En python2, 'input()' es malo porque 'eval (raw_input())'. Siempre debe usar 'raw_input()'. En python3, 'input()' tiene el comportamiento deseado (siempre devuelve 'str'). –

7

¿Por qué? ¿Es una lista de comprensión el método recomendado?

lista por comprensión se recomienda en the tutorial example, que establece

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

y por la mayoría de los que responden en SO de Python List Comprehension Vs. Map donde it is

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

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

Cuestiones relacionadas