Comment puis-je amener Pyflakes à ignorer une déclaration?
Question
Beaucoup de nos modules commencent par:
try:
import json
except ImportError:
from django.utils import simplejson as json # Python 2.4 fallback.
... et c'est le seul avertissement Pyflakes dans l'ensemble du fichier:
foo/bar.py:14: redefinition of unused 'json' from line 12
Comment puis-je amener Pyflakes à ignorer cela?
(Normalement j'irais lire les documents Mais le lien est rompu. Si personne n'a de réponse, je vais juste lire la source.)
La solution
Si vous pouvez utiliser floke8 Au lieu de cela - qui enveloppe les pyflakes ainsi que le checker PEP8 - une ligne se terminant avec
# NOQA
(dans lequel l'espace est significatif - 2 espaces entre la fin du code et le #
, un entre lui et le NOQA
Texte) indiquera au vérificateur d'ignorer les erreurs sur cette ligne.
Autres conseils
Je sais que cela a été remis en question il y a quelque temps et est déjà répondu.
Mais je voulais ajouter ce que j'utilise habituellement:
try:
import json
assert json # silence pyflakes
except ImportError:
from django.utils import simplejson as json # Python 2.4 fallback.
Oui, malheureusement Dimod.org est en panne avec tous les goodies.
En regardant le code Pyflakes, il me semble que Pyflakes est conçu pour qu'il soit facile de l'utiliser comme "vérificateur rapide intégré".
Pour implémenter les fonctionnalités Ignore, vous devrez écrire le vôtre qui appelle le vérificateur Pyflakes.
Ici, vous pouvez trouver une idée: http://djangosnippets.org/snippets/1762/
Notez que l'extrait ci-dessus uniquement pour les commentaires sur la même ligne. Pour ignorer un bloc entier, vous voudrez peut-être ajouter «pyflakes: ignorer» dans le bloc docstring et filtre basé sur Node.doc.
Bonne chance!
J'utilise Pocket-lint pour toutes sortes d'analyses de code statique. Voici les modifications apportées à la poche pour ignorer les pyflakes: https://code.launchpad.net/~adiroiban/pocket-lint/907742/+merge/102882
Voici un patch de singe pour les pyflakes qui ajoute un # bypass_pyflakes
option de commentaire.
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 vous enregistrez ceci sous bypass_pyflakes.py
, alors vous pouvez l'invoquer comme python bypass_pyflakes.py myfile.py
.
http://chase-seibert.github.com/blog/2013/01/11/bypass_pyflakes.html
Pour citer le billet de problème github:
Bien que le correctif arrive toujours, c'est ainsi qu'il peut être travaillé, si vous vous demandez:
try: from unittest.runner import _WritelnDecorator _WritelnDecorator; # workaround for pyflakes issue #13 except ImportError: from unittest import _WritelnDecorator
Supply _uniTest et _Writelndecorator avec les entités (modules, fonctions, classes) dont vous avez besoin
-- déménager
Vous pouvez également importer avec __import__
. Ce n'est pas pythonique, mais Pyflakes ne vous avertit plus. Voir documentation pour __import__
.
try:
import json
except ImportError:
__import__('django.utils', globals(), locals(), ['json'], -1)
J'ai créé un petit script shell avec certains awk
magie pour m'aider. Avec cela toutes les lignes avec import typing
, from typing import
ou #$
(ce dernier est un commentaire spécial que j'utilise ici) sont exclus ($1
est le nom de fichier du 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 ...
Fondamentalement, il note les nombres de ligne et crée dynamiquement un regex fois.