¿Cómo hago para que Pyflakes ignore una declaración?

137

Muchos de nuestros módulos comienzan con:

try:
    import json
except ImportError:
    from django.utils import simplejson as json  # Python 2.4 fallback.

... y es la única advertencia de Pyflakes en todo el archivo:

foo/bar.py:14: redefinition of unused 'json' from line 12

¿Cómo puedo hacer que Pyflakes ignore esto?

(Normalmente iría a leer los documentos, pero el enlace está roto. Si nadie tiene una respuesta, simplemente leeré la fuente).

un nerd pagado
fuente
44
¡Me gustaría ver un parche para PyFlakes para esto!
Kimvais
2
Este es un error de los copos de nieve de larga data. La persona que lo arregle recibirá una cerveza firmada personalmente por el autor de pyflakes.
Phil Frost

Respuestas:

215

Si puede usar flake8 en su lugar, que envuelve los copos de nieve y el verificador pep8, una línea que termina con

# NOQA

(en el que el espacio es significativo: 2 espacios entre el final del código y el #, uno entre este y el NOQAtexto) le indicarán al verificador que ignore cualquier error en esa línea.

realmente
fuente
Si solo hubiera una manera de obtener esto de algún repositorio para EL6 :) - Creo que tendré que envolver esto en rpm.
Kimvais
13
agradable, pero no es una solución para los copos de nieve
ezdazuzena
77
Consejos: agregar esta línea # flake8: noqale dirá a flake8 que ignore la validación de todo el archivo.
Reorx
3
# noqasolo ignora ciertas advertencias / errores, pero no todos: para solucionar esto, una solución consiste en instalar / usar el paquete en pypi.python.org/pypi/flake8-respect-noqa
Mark
8
Consejos # noqa: F841significa ignorar solo el F841error en la línea.
SangminKim
47

Sé que esto fue cuestionado hace algún tiempo y ya está respondido.

Pero quería agregar lo que suelo usar:

try:
    import json
    assert json  # silence pyflakes
except ImportError:
    from django.utils import simplejson as json  # Python 2.4 fallback.
mfussenegger
fuente
Esto es en realidad lo que terminamos haciendo. (Bueno, esto y analizar la salida de pyflakes para ignorar los errores en las líneas con un silence pyflakescomentario). ¡Gracias!
un nerd pagado el
Creo que la assertdeclaración es suficiente para silenciar al corrector en este caso. Buen truco, por cierto.
Anton Strogonoff
¿Está documentado en alguna parte?
Tapa de Håken el
7

Sí, desafortunadamente dimod.org está abajo junto con todas las golosinas.

Al mirar el código de pyflakes, me parece que pyflakes está diseñado para que sea fácil de usar como un "verificador rápido incrustado".

Para implementar la funcionalidad de ignorar, deberá escribir una propia que llame al verificador de pyflakes.

Aquí puede encontrar una idea: http://djangosnippets.org/snippets/1762/

Tenga en cuenta que el fragmento anterior solo para los lugares de comentarios en la misma línea. Para ignorar un bloque completo, es posible que desee agregar 'pyflakes: ignore' en la cadena de documentos del bloque y en el filtro basado en node.doc.

¡Buena suerte!


Estoy usando Pocket-Lint para todo tipo de análisis de código estático. Estos son los cambios realizados en la pelusa de bolsillo para ignorar los copos de nieve: https://code.launchpad.net/~adiroiban/pocket-lint/907742/+merge/102882

Adi Roiban
fuente
1
divmod.org está caído, pero las cosas buenas se pueden encontrar en launchpad ( code.launchpad.net/divmod.org ).
thebjorn
6

Para citar el ticket de emisión de github :

Si bien la solución aún está por llegar, así es como se puede solucionar, si se está preguntando:

try:
    from unittest.runner import _WritelnDecorator
    _WritelnDecorator; # workaround for pyflakes issue #13
except ImportError:
    from unittest import _WritelnDecorator

Sustituya _unittest y _WritelnDecorator con las entidades (módulos, funciones, clases) que necesita

- deemoowoor

Daenyth
fuente
y _WritelnDecorator;no hace absolutamente nada, ¿verdad? Entonces, ¿puedo usar esto para hacer que pyflakes ignore las variables no utilizadas que realmente se usan dentro de las cadenas eval o numexpr al enumerar las variables en una línea separada? ¿Es incluso necesario el punto y coma?
endolito
1
En realidad, usando dis.dis, esto aparentemente hace un LOAD_FASTy POP_TOPpara cada variable en una línea por sí misma (¿la coloca en la pila y luego la elimina de la pila?), Por lo que no está haciendo nada. Mejor que assert, sin embargo.
endolito
El punto y coma no es necesario. Las afirmaciones se pueden ignorar a través del interruptor de optimización para que no sean totalmente inútiles.
Gringo Suave
6

Aquí hay un parche de mono para pyflakes que agrega una # bypass_pyflakesopción de comentario.

bypass_pyflakes.py

#!/usr/bin/env python

from pyflakes.scripts import pyflakes
from pyflakes.checker import Checker


def report_with_bypass(self, messageClass, *args, **kwargs):
    text_lineno = args[0] - 1
    with open(self.filename, 'r') as code:
        if code.readlines()[text_lineno].find('bypass_pyflakes') >= 0:
            return
    self.messages.append(messageClass(self.filename, *args, **kwargs))

# monkey patch checker to support bypass
Checker.report = report_with_bypass

pyflakes.main()

Si guarda esto como bypass_pyflakes.py, puede invocarlo como python bypass_pyflakes.py myfile.py.

http://chase-seibert.github.com/blog/2013/01/11/bypass_pyflakes.html

Chase Seibert
fuente
No estoy seguro de qué cambió o si hubo un error en el código original, pero mi versión de pyflakes (0.9.2) requiere que text_lineno = args[0] - 1se cambie a text_lineno = args[0].lineno - 1. Recomiendo actualizar esta respuesta para reflejar esto.
John Lunzer
1

También puedes importar con __import__. No es pitónico, pero pyflakes ya no te advierte. Ver documentación para__import__ .

try:
    import json
except ImportError:
    __import__('django.utils', globals(), locals(), ['json'], -1)
mrijken
fuente
40
Estoy buscando una manera de hacer que los copos de nieve ignoren los errores, no una forma de uglificar mi código :)
Kimvais
Además, esto no es una solución cuando se hace algo comofrom foo import bar
ezdazuzena
0

Creé un pequeño script de shell con algo de awkmagia para ayudarme. Con esto import typing, se excluyen todas las líneas con , from typing importo #$(este último es un comentario especial que estoy usando aquí) ( $1es el nombre del archivo del script Python):

result=$(pyflakes -- "$1" 2>&1)

# check whether there is any output
if [ "$result" ]; then

    # lines to exclude
    excl=$(awk 'BEGIN { ORS="" } /(#\$)|(import +typing)|(from +typing +import )/ { print sep NR; sep="|" }' "$1")

    # exclude lines if there are any (otherwise we get invalid regex)
    [ "$excl" ] &&
        result=$(awk "! /^[^:]+:(${excl}):/" <<< "$result")

fi

# now echo "$result" or such ...

Básicamente, anota los números de línea y crea dinámicamente una expresión regular.

phk
fuente