2011-02-17 16 views
111

Muchos de nuestros módulos comienza con:¿Cómo hago que Pyflakes ignore una declaración?

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

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

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

¿Cómo puedo obtener pyflakes hacer caso omiso de esto?

(Normalmente me gustaría ir leer the docs pero el vínculo está roto. Si nadie tiene una respuesta, sólo voy a leer la fuente.)

+4

¡Me gustaría ver un parche para PyFlakes para esto! – Kimvais

+0

Ref: https://github.com/kevinw/pyflakes/issues/13 – Daenyth

+1

Este es un error de pyflakes de larga data. La persona que lo arregle obtendrá una cerveza firmada personalmente por el autor de pyflakes. –

Respuesta

176

Si puede utilizar flake8 lugar - que envuelve pyflakes así como el corrector PEP8 - una línea que termina con

# NOQA

(en los que el espacio es significativo - 2 espacios entre el final de el código y el #, uno entre él y el texto NOQA le indicarán al inspector que ignore cualquier error en esa línea.

+0

Si solo hubiera una manera de obtener esto de algún repositorio para EL6 :) - Creo que tendré que envolver esto en un rpm yo mismo. – Kimvais

+0

@Kimvais, probablemente pondré mi ignorancia en exhibición aquí, pero ¿no puede obtener [setuptools] (http://pypi.python.org/pypi/setuptools) o [distribuir] (http: // pypi. python.org/pypi/distribute)? Cualquiera de estos le dará el comando 'easy_install'. Luego puede obtener [pip] (http://pypi.python.org/pypi/pip/1.1), con el cual puede instalar flake8. Al menos en Ubuntu, 'pip install' es la forma de adquirir los paquetes de Python que no se proporcionan en la distribución. – yrstruly

+0

sí, uso pip, pero a algunas personas no les gusta que el software se instale fuera del sistema de gestión de paquetes: afortunadamente 'python setup.py bdist_rpm' funciona en la mayoría de los paquetes. – Kimvais

7

Sí, por desgracia dimod.org está abajo junto con todos los extras.

Mirando el código de pyflakes, me parece que pyflakes está diseñado para que sea fácil de usar como un "comprobador rápido integrado".

Para implementar la funcionalidad de ignorar, tendrá que escribir una que llame al comprobador de pyflakes.

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

Nota que el fragmento anterior sólo para lugares de comentarios en la misma línea. Para ignorar un bloque completo es posible que desee agregar 'pyflakes: ignore' en el bloque docstring y filter basado en node.doc.

¡Buena suerte!


Estoy usando bolsillo-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: https://code.launchpad.net/~adiroiban/pocket-lint/907742/+merge/102882

+1

divmod.org está fuera de servicio, pero los extras se pueden encontrar en launchpad (https://code.launchpad.net/divmod.org). – thebjorn

2

También puede importar con __import__. No es pitónico, pero Pyflakes ya no te lo advierte. Ver documentation for __import__.

try: 
    import json 
except ImportError: 
    __import__('django.utils', globals(), locals(), ['json'], -1) 
+35

Estoy buscando una manera de hacer que pyflakes ignoren los errores, no una forma de _uglificar_ mi código :) – Kimvais

+0

Además, esta no es una solución cuando se hace algo como 'from foo import bar' – ezdazuzena

5

citar el github issue ticket:

Mientras que la solución todavía está llegando, esta es la forma en que se puede evitar, si se está preguntando:

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

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

- deemoowoor

+0

y' _WritelnDecorator; 'no hace absolutamente nada , ¿derecho? Así que puedo usar esto para que pyflakes ignore las variables no utilizadas que se usan en [eval] (http://docs.python.org/2/library/functions.html#eval) o [numexpr] (https: // code.google.com/p/numexpr/) cadenas al enumerar las variables en una línea separada? ¿El punto y coma es necesario? – endolith

+1

En realidad, usando 'dis.dis', esto aparentemente hace' LOAD_FAST' y 'POP_TOP' para cada variable en una línea sola (la pone en la pila y luego la elimina de la pila?), Así que no está haciendo nada . Mejor que 'afirmar', sin embargo. – endolith

36

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

pero quería añadir lo que suelo usar:

try: 
    import json 
    assert json # silence pyflakes 
except ImportError: 
    from django.utils import simplejson as json # Python 2.4 fallback. 
+0

Esto es realmente lo que terminamos haciendo. (Bueno, este _y_ analizar la salida de pyflakes para ignorar los errores en las líneas con un comentario 'silence pyflakes'.) ¡Gracias! –

+0

Creo que la afirmación 'assert' es suficiente para silenciar al verificador en este caso. Buen truco, por cierto. – Tony

5

Aquí es un parche para el mono pyflakes que añade una opción # bypass_pylakes comentario.

#!/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, a continuación, se puede invocar como python bypass_pyflakes.py myfile.py.

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

0

he creado un pequeño script de shell con un poco de magia awk para ayudarme. Con esta todas las líneas con import typing, from typing import o #$ (este último es un comentario especial que estoy usando aquí) se excluyen ($1 es el nombre de archivo del script de 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 se toma nota de los números de línea y dinámicamente crea una expresión regular de ella.

Cuestiones relacionadas