web-dev-qa-db-fra.com

Comment faire pour que Pyflakes ignore une déclaration?

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 l'ignore?

(Normalement j'irais lire les docs mais le lien est cassé. Si personne n'a de réponse, je lirai juste la source.)

129
a paid nerd

Si vous pouvez utiliser flake8 à la place - qui enveloppe 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 lui et le NOQA texte) indiquera au vérificateur d’ignorer les erreurs éventuelles sur cette ligne.

205
yrstruly

Je sais que cela a été remis en question il y a quelque temps et que l'on y a 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.
45
mfussenegger

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 être facile à utiliser comme "vérificateur rapide intégré".

Pour implémenter les fonctionnalités d'ignorer, vous devrez écrire votre propre appelant le vérificateur pyflakes.

Ici vous pouvez trouver une idée: http://djangosnippets.org/snippets/1762/

Notez que l'extrait ci-dessus ne concerne que les emplacements de commentaires situés sur la même ligne. Pour ignorer un bloc entier, vous pouvez ajouter "pyflakes: ignore" à la docstring block et filtrer en fonction de 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 pyflakes: https://code.launchpad.net/~adiroiban/pocket-lint/907742/+merge/102882

7
Adi Roiban

Voici un patch de singe pour 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 en tant que 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

6
Chase Seibert

Pour citer le ticket d’émission github :

Alors que le correctif est encore à venir, voici comment résoudre le problème, 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

5
Daenyth

Vous pouvez également importer avec __import__. Ce n'est pas Pythonic, mais pyflakes ne vous prévient plus. Voir documentation pour __import__ .

try:
    import json
except ImportError:
    __import__('Django.utils', globals(), locals(), ['json'], -1)
2
mrijken

J'ai créé un petit script Shell avec la magie awk 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) est exclu ($1 est le nom du 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 regex.

0
phk