Comment faire pour que Pyflakes ignore une instruction?

137

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 tout le fichier:

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

Comment puis-je faire en sorte que Pyflakes ignore cela?

(Normalement, j'irais lire la documentation mais le lien est cassé. Si personne n'a de réponse, je vais simplement lire la source.)

un nerd payé
la source
4
J'aimerais voir un patch pour PyFlakes pour cela!
Kimvais
2
C'est un bug de pyflakes de longue date. La personne qui le réparera recevra une bière personnellement signée par l'auteur des pyflakes.
Phil Frost

Réponses:

215

Si vous pouvez utiliser flake8 à la place - qui enveloppe les pyflakes ainsi que le vérificateur pep8 - une ligne se terminant par

# NOQA

(dans lequel l'espace est significatif - 2 espaces entre la fin du code et le #, un entre celui-ci et le NOQAtexte) indiquera au vérificateur d'ignorer toute erreur sur cette ligne.

yrstruly
la source
S'il y avait seulement un moyen d'obtenir cela à partir d'un dépôt pour EL6 :) - Je suppose que je vais devoir l'envelopper moi-même dans un rpm.
Kimvais
13
sympa, mais pas une solution pour les pyflakes
ezdazuzena
7
Astuces: ajouter cette ligne # flake8: noqaindiquera à flake8 d'ignorer la validation pour l'ensemble du fichier.
Reorx
3
# noqaignore uniquement certains avertissements / erreurs, mais pas tous - pour résoudre ce problème, une solution de contournement consiste à installer / utiliser le package à l' adresse pypi.python.org/pypi/flake8-respect-noqa
Mark
8
Conseils # noqa: F841signifie ignorer uniquement l' F841erreur sur la ligne.
SangminKim
47

Je sais que cela a été remis en question il y a quelque temps et qu'on y répond déjà.

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.
mfussenegger
la source
C'est en fait ce que nous avons fini par faire. (Eh bien, cela et l' analyse de la sortie de pyflakes pour ignorer les erreurs sur les lignes avec un silence pyflakescommentaire.) Merci!
un nerd payé
Je pense que la assertdéclaration est suffisante pour faire taire le vérificateur dans ce cas. Belle astuce, au fait.
Anton Strogonoff
Est-ce documenté quelque part?
Håken Lid
7

Oui, malheureusement dimod.org est en panne avec tous les goodies.

En regardant le code de pyflakes, il me semble que pyflakes est conçu pour qu'il soit facile de l'utiliser comme un "vérificateur rapide intégré".

Pour implémenter la fonctionnalité Ignorer, 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 est placé sur la même ligne. Pour ignorer un bloc entier, vous voudrez peut-être ajouter «pyflakes: ignore» dans le bloc docstring et filtre basé sur node.doc.

Bonne chance!


J'utilise pocket-lint pour tout type d'analyse de code statique. Voici les modifications apportées à pocket-lint pour ignorer les pyflakes: https://code.launchpad.net/~adiroiban/pocket-lint/907742/+merge/102882

Adi Roiban
la source
1
divmod.org est en panne, mais les goodies peuvent être trouvés sur le tableau de bord ( code.launchpad.net/divmod.org ).
thebjorn
6

Pour citer le ticket d'émission github :

Alors que le correctif est toujours à venir, voici comment il peut être contourné, si vous vous demandez:

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

Substitude _unittest et _WritelnDecorator avec les entités (modules, fonctions, classes) dont vous avez besoin

- deemoowoor

Daenyth
la source
et _WritelnDecorator;ne fait absolument rien, non? Je peux donc l'utiliser pour que les pyflakes ignorent les variables inutilisées qui sont réellement utilisées dans les chaînes eval ou numexpr en listant les variables sur une ligne séparée? Le point-virgule est-il même nécessaire?
endolith
1
En fait, en utilisant dis.dis, cela fait apparemment un LOAD_FASTet POP_TOPpour chaque variable sur une ligne par lui-même (le met sur la pile puis le supprime de la pile?), Donc ça ne fait rien. Mieux que assert, cependant.
endolith
Point-virgule pas nécessaire. Les affirmations peuvent être ignorées via le commutateur d'optimisation, donc pas totalement inutile.
Gringo Suave
6

Voici un patch de singe pour pyflakes qui ajoute une # bypass_pyflakesoption 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 cela sous bypass_pyflakes.py, vous pouvez l'invoquer en tant que python bypass_pyflakes.py myfile.py.

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

Chase Seibert
la source
Je ne suis pas sûr de ce qui a changé ou s'il y avait une erreur dans le code d'origine, mais ma version de pyflakes (0.9.2) nécessite que ce text_lineno = args[0] - 1soit changé en text_lineno = args[0].lineno - 1. Je recommande de mettre à jour cette réponse pour refléter cela.
John Lunzer le
1

Vous pouvez également importer avec __import__. Ce n'est pas pythonique, mais pyflakes ne vous prévient plus. Consultez la documentation pour__import__ .

try:
    import json
except ImportError:
    __import__('django.utils', globals(), locals(), ['json'], -1)
mrijken
la source
40
Je cherche un moyen de faire ignorer les erreurs par pyflakes, pas un moyen de vilipender mon code :)
Kimvais
De plus, ce n'est pas une solution lorsque vous faites quelque chose commefrom foo import bar
ezdazuzena
0

J'ai créé un petit script shell avec un peu de awkmagie pour m'aider. Avec cela, toutes les lignes avec import typing, from typing importou #$(ce dernier est un commentaire spécial que j'utilise ici) sont exclues ( $1est 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 numéros de ligne et crée dynamiquement une expression régulière.

phk
la source