¿Cómo desactivo una advertencia de Pylint?

267

Estoy tratando de desactivar la advertencia C0321 ("más de una declaración en una sola línea", a menudo pongo ifdeclaraciones con resultados cortos de una sola línea en la misma línea), en Pylint 0.21.1 (si es importante: astng 0.20. 1, común 0.50.3, Python 2.6.6 (r266: 84292, 15 de septiembre de 2010, 16:22:56)).

Intenté agregar disable=C0321el archivo de configuración de Pylint, pero Pylint insiste en informarlo de todos modos. Variaciones sobre esa línea (como disable=0321o disable=C321) se marcan como errores, por lo Pylint hace reconocer la opción adecuada, es simplemente ignorarlo.

¿Es esto un error de Pylint, o estoy haciendo algo mal? ¿Hay alguna forma de evitar esto? Realmente me gustaría deshacerme de este ruido.

Geek principal
fuente
1
Aquí hay una buena solución si desea deshabilitar una sola línea de código, no todos los errores de un tipo.
Le Droid

Respuestas:

168

pylint --generate-rcfile lo muestra así:

[MESSAGES CONTROL]

# Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option
# multiple time.
#enable=

# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifier separated by comma (,) or put this option
# multiple time (only on the command line, not in the configuration file where
# it should appear only once).
#disable=

Por lo tanto, parece que ~/.pylintrcdebería tener las disable=líneas dentro de una sección [MESSAGES CONTROL].

Chris Morgan
fuente
1
Gracias, pero ya lo hace, en la sección [CONTROL DE MENSAJES] como se muestra arriba. Aún ignorado.
Head Geek
66
@ Head Geek: bueno, funciona para mí. ~/.pylintrccon dos líneas [MESSAGES CONTROL]y disable=C0321. Eso evita ese mensaje.
Chris Morgan
Extraño ... ¿exactamente la misma versión de PyLint?
Head Geek
@Head Geek: 0.21.3, astng 0.20.3 y común 0.52.1 en realidad (el último cuando lo instalé, más reciente que el tuyo)
Chris Morgan
1
@ Chris Morgan: Ah. Probablemente un error que ya se solucionó, entonces, estoy usando la versión del repositorio de Ubuntu. ¡Gracias!
Head Geek
165

Tuve este problema usando Eclipse y lo resolví de la siguiente manera:

en la carpeta pylint (por ejemplo C:\Python26\Lib\site-packages\pylint), mantenga presionada la tecla Mayús, haga clic con el botón derecho y elija abrir el comando de Windows en esa carpeta. Tipo:

lint.py --generate-rcfile > standard.rc

Esto crea el standard.rcarchivo de configuración. Ábralo en el bloc de notas y debajo [MESSAGES CONTROL], descomente disable=y agregue las ID de mensaje que desea deshabilitar, por ejemplo:

disable=W0511, C0321

Guarde el archivo, y en Eclipse-> ventana-> preferencias-> PyDev-> pylint, en el cuadro de argumentos, escriba:

--rcfile=C:\Python26\Lib\site-packages\pylint\standard.rc

Ahora debería funcionar ...


También puede agregar un comentario en la parte superior de su código que será interpretado por pylint:

# pylint: disable=C0321

enlace a todos los códigos de mensajes pylint


Agregar, por ejemplo, --disable-ids=C0321en el cuadro de argumentos no funciona. Todos los mensajes de pylint disponibles se almacenan en el diccionario _messages, un atributo de una instancia de la pylint.utils.MessagesHandlerMixInclase. Al ejecutar pylint con el argumento --disable-ids=...(al menos sin un archivo de configuración), este diccionario está inicialmente vacío, provocando una excepción KeyError dentro de pylint ( pylint.utils.MessagesHandlerMixIn.check_message_id(). En Eclipse, puede ver este mensaje de error en la consola de Pylint (windows - show view - Console , seleccione la consola Pylint de las opciones de la consola además del icono de la consola).

Remi
fuente
2
No, realmente no debería. 1) Hace referencia a Eclipse, que es irrelevante para la pregunta formulada 2) Recomienda deshabilitar los códigos de mensajes heredados. Recomendaría mi respuesta para la solución más simple al problema, o la respuesta de Chris Johnson para más detalles.
imolit
153

A partir de Pylint v. 0.25.3, puede usar los nombres simbólicos para deshabilitar las advertencias en lugar de tener que recordar todos esos números de código . P.ej:

# pylint: disable=locally-disabled, multiple-statements, fixme, line-too-long

Este estilo es más instructivo que los códigos de error crípticos, y también más práctico ya que las versiones más nuevas de Pylint solo muestran el nombre simbólico, no el código de error.

La correspondencia entre nombres simbólicos y códigos se puede encontrar aquí .

Se puede insertar un comentario de desactivación en su propia línea, aplicando la desactivación a todo lo que viene después en el mismo bloque. Alternativamente, se puede insertar al final de la línea para la cual se debe aplicar.

Si pylint emite Locally disablingmensajes " ", puede deshacerse de ellos incluyendo locally-disabled primero la desactivación como en el ejemplo anterior.

imolit
fuente
20
Pero poner # pylint: disable=fooinlyne me hace esperar demasiado, así que ahora necesito agregar , line-too-long. Lengua en la mejilla; Esto era lo que necesitaba y resuelve mi problema. ¡Gracias!
dwanderson
Lista con las cadenas reales para usar: gist.github.com/m451/965bb613177dd4fa896b815aa0e0e365
masi
81

Para deshabilitar una advertencia localmente en un bloque, agregue

# pylint: disable=C0321

a ese bloque

thakis
fuente
55
Esta es una técnica heredada y ya no se recomienda. Ver las otras respuestas.
Acumenus
1
¿Quiere decir que uno debe usar el nombre simbólico en lugar del número de código, sí?
thakis
55
Si. La respuesta de imolit cubre exactamente esto.
Acumenus
2
¿Cómo se encuentra el nombre simbólico? Mi editor escupirá [pylint] C0111: Missing method docstring, así que encontrar el número de código es fácil, pero encontrar el nombre simbólico significa que tengo que buscarlo.
Adam Parkin
@ AdamParkin Encontré mis mensajes aquí: pylint-messages.wikidot.com/all-messages
Jean-Francois T.
81

Hay varias formas de deshabilitar las advertencias y errores de Pylint. Cuál usar tiene que ver con qué nivel global o local desea aplicar la desactivación, una decisión de diseño importante.

Enfoques múltiples

  1. En uno o más pylintrcarchivos.

Esto implica más que el ~/.pylintrcarchivo (en su directorio $ HOME) como lo describe Chris Morgan. Pylint buscará archivos rc, con una precedencia que valora más los archivos "más cercanos":

  • Un pylintrcarchivo en el directorio de trabajo actual; o

  • Si el directorio de trabajo actual está en un módulo de Python (es decir, contiene un __init__.pyarchivo), buscar en la jerarquía de los módulos de Python hasta encontrar un pylintrcarchivo; o

  • El archivo nombrado por la variable de entorno PYLINTRC; o

  • Si tiene un directorio de inicio que no es /root:

    • ~/.pylintrc; o

    • ~/.config/pylintrc; o

    • /etc/pylintrc

Tenga en cuenta que la mayoría de estos archivos tienen nombre pylintrc, solo el archivo en~ tiene un punto inicial.

A su pylintrcarchivo, agregue líneas para deshabilitar mensajes específicos de pylint. Por ejemplo:

[MESSAGES CONTROL]
disable=locally-disabled
  1. Más desactiva desde la pylintlínea de comando, como se describe por Aboo y Cairnarvon. Esto se parece pylint --disable=bad-builtin. Repita --disablepara suprimir elementos adicionales.

  2. Deshabilita aún más las líneas de código individuales de Python, como lo describe Imolit. Estos se ven como some statement # pylint: disable=broad-except(comentario adicional al final de la línea de origen original) y se aplican solo a la línea actual . Mi enfoque es ponerlos siempre al final de otras líneas de código para que no se confundan con el estilo de bloque, ver más abajo.

  3. Más desactivaciones definidas para bloques más grandes de código Python, hasta completar archivos fuente.

    • Estos se ven como # pragma pylint: disable=bad-whitespace(tenga en cuenta la pragmapalabra clave).

    • Estos se aplican a cada línea después de la pragma. Al poner un bloque de estos en la parte superior de un archivo, las supresiones se aplican a todo el archivo. Colocar el mismo bloque más abajo en el archivo hace que se apliquen solo a las líneas que siguen al bloque. Mi enfoque es ponerlos siempre en una línea propia para que no se confundan con el estilo de una sola línea, ver arriba.

    • Cuando una supresión solo debe aplicarse dentro de un rango de código, use # pragma pylint: enable=bad-whitespace(ahora usando enablenot disable) para detener la supresión.

Tenga en cuenta que la desactivación de una sola línea utiliza la # pylintsintaxis, mientras que la desactivación de esta línea en adelante utiliza la # pragma pylintsintaxis. Estos son fáciles de confundir, especialmente al copiar y pegar.

Poniendolo todo junto

Usualmente uso una combinación de estos enfoques.

  • Lo uso ~/.pylintrcpara estándares absolutamente globales, muy pocos de estos.

  • Uso el nivel de proyecto pylintrcen diferentes niveles dentro de los módulos de Python cuando hay estándares específicos del proyecto. Especialmente cuando aceptas el código de otra persona o equipo, puedes encontrar que usan convenciones que no prefieres, pero no quieres volver a trabajar el código. Mantener la configuración en este nivel ayuda a no difundir esas prácticas a otros proyectos.

  • Uso los pragmas de estilo de bloque en la parte superior de los archivos de origen único. Me gusta desactivar los pragmas (dejar de suprimir mensajes) en pleno desarrollo incluso para los estándares de Pylint con los que no estoy de acuerdo (como "muy pocos métodos públicos", siempre recibo esa advertencia en las clases de excepción personalizadas), pero es útil ver más / tal vez todos los mensajes de Pylint mientras se está desarrollando. De esa manera, puede encontrar los casos que desea abordar con pragmas de una sola línea (ver más abajo), o simplemente agregar comentarios para el próximo desarrollador para explicar por qué esa advertencia está bien en este caso.

  • Dejo algunos de los pragmas de estilo de bloque habilitados incluso cuando el código está listo para registrarse. Intento usar algunos de esos, pero cuando tiene sentido para el módulo, está bien hacerlo como documentación. Sin embargo, trato de dejar lo menos posible, preferiblemente ninguno.

  • Utilizo el estilo de comentario de una sola línea para abordar errores especialmente potentes. Por ejemplo, si hay un lugar en el que realmente tiene sentido hacerlo except Exception as exc, lo pongo # pylint: disable=broad-excepten esa línea en lugar de un enfoque más global porque esta es una excepción extraña y debe llamarse, básicamente como una forma de documentación.


Como todo lo demás en Python, puede actuar en diferentes niveles de indirección. Mi consejo es pensar en lo que pertenece a qué nivel para que no termines con un enfoque demasiado indulgente para Pylint.

Chris Johnson
fuente
1
La mejor respuesta, similar a stackoverflow.com/questions/16266452/…
Christophe Roussy el
1
En su mayor parte, no puedo recomendar el uso de un vacío global ~/.pylintrc. En mi humilde opinión, la configuración normalmente debe estar vinculada al proyecto, por lo que debe estar en algún lugar dentro del proyecto. Solo entonces se puede controlar la versión y compartir con el proyecto. De lo contrario, un clon puede carecer de las personalizaciones necesarias para que pylint salga sin imprimir mensajes.
Acumenus
@ABB Creo que es sabio
Chris Johnson
3
@ChrisJohnson El prefijo pragma parece totalmente innecesario. Por ejemplo, tengo # pylint: disable=missing-docstringen la parte superior de mi archivo, y se aplica a todo el resto del archivo. Verifique y elimine el pragmaprefijo de su respuesta.
Acumenus
Pylint FAQ no escribe sobre ningún pragma. ( pylint.pycqa.org/en/latest/… ): puede deshabilitar o habilitar los mensajes (deshabilitados globalmente) en el nivel del módulo agregando la opción correspondiente en un comentario en la parte superior del archivo: # pylint: disable = wildcard- importación, método oculto # pylint: enable = too-many-lines
Yaroslav Nikitenko
19

También puede usar el siguiente comando:

pylint --disable=C0321  test.py

Mi versión de pylint es 0.25.1.

aboo
fuente
Esta es ahora una técnica heredada. En su lugar, se recomienda el uso del nombre simbólico de la advertencia deshabilitada. Mira esta respuesta .
Acumenus
Esto tampoco parece funcionar con la --py3kbandera :(
DylanYoung
Curiosamente, funciona bien si se proporciona en el rcarchivo, y (más problemático) en realidad genera un rcarchivo correcto --generate-rcfile. Tengo que amar el código con múltiples ramas que hacen lo mismo :(
DylanYoung
18

Esta es una pregunta frecuente :

4.1 ¿Es posible deshabilitar localmente un mensaje en particular?

Sí, esta característica se ha agregado en Pylint 0.11. Esto puede hacerse agregando
# pylint: disable=some-message,another-oneen el nivel de bloque deseado o al final de la línea de código deseada.

4.2 ¿Hay alguna forma de deshabilitar un mensaje solo para un módulo en particular?

Sí, puede deshabilitar o habilitar mensajes (deshabilitados globalmente) en el nivel del módulo agregando la opción correspondiente en un comentario en la parte superior del archivo:

# pylint: disable=wildcard-import, method-hidden
# pylint: enable=too-many-lines

Puede deshabilitar los mensajes de la siguiente manera:

  • numérica Identificación: E1101,E1102 etc.
  • mensaje simbólico: no-member,undefined-variable etc.
  • El nombre de un grupo de cheques. Puedes agarrar a aquellos conpylint --list-groups .
  • categoría de comprobaciones: C, R,W , etc.
  • todos los cheques con all.

Ver los documentos (o ejecutar pylint --list-msgsen la terminal) para la lista completa de pylintmensajes de. Los documentos también proporcionan un buen ejemplo de cómo usar esta función.

Eugene Yarmash
fuente
5

Solo tiene que agregar una línea para deshabilitar lo que desea deshabilitar. P.ej

#pylint: disable = line-too-long, too-many-lines, no-name-in-module, import-error, multiple-imports, pointless-string-statement, wrong-import-order

Agregue esto al # 1 en su módulo

Chetan Malhotra
fuente
4

En caso de que esto ayude a alguien, si está usando Visual Studio Code, espera que el archivo esté en codificación UTF8. Para generar el archivo, ejecuté pylint --generate-rcfile | out-file -encoding utf8 .pylintrcen PowerShell.

Elijah W. Gagne
fuente
0

Según la documentación de pylint , lo más fácil es usar este cuadro :

  • C cheques relacionados con convenciones
  • R refactorizando cheques relacionados
  • W varias advertencias
  • E errores, por posibles errores en el código
  • F fatal, si ocurrió un error que impidió que pylint realizara un procesamiento adicional.

Entonces uno puede usar:

pylint -j 0 --disable=I,E,R,W,C,F YOUR_FILES_LOC
Arindam Roychowdhury
fuente
-1

La sintaxis de Python permite más de una declaración en una línea, separada por punto y coma (;). Sin embargo, limitar cada línea a una declaración facilita que un humano siga la lógica de un programa al leerla.

Entonces, otra forma de resolver este problema es entender por qué está presente el mensaje de pelusa y no poner más de una declaración en una línea.

Sí, puede que le resulte más fácil escribir varias declaraciones por línea, sin embargo, pylint es para todos los demás lectores de su código, no solo para usted.

hrf
fuente
-1

Es posible que desee probar esto:

Edite "C: \ Users \ Your User \ AppData \ Roaming \ Code \ User \ settings.json" y agregue python.linting.pylintArgslíneas al final como se muestra a continuación:

{
    "team.showWelcomeMessage": false,
    "python.dataScience.sendSelectionToInteractiveWindow": true,
    "git.enableSmartCommit": true,
    "powershell.codeFormatting.useCorrectCasing": true,
    "files.autoSave": "onWindowChange",
    "python.linting.pylintArgs": [
        "--load-plugins=pylint_django",
        "--errors-only"
    ],
}
aarw76
fuente