Wie bringe ich Pyflakes dazu, eine Aussage zu ignorieren?

137

Viele unserer Module beginnen mit:

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

... und es ist die einzige Pyflakes-Warnung in der gesamten Datei:

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

Wie kann ich Pyflakes dazu bringen, dies zu ignorieren?

(Normalerweise würde ich die Dokumente lesen, aber der Link ist defekt. Wenn niemand eine Antwort hat, lese ich einfach die Quelle.)

ein bezahlter Nerd
quelle
4
Ich würde gerne einen Patch für PyFlakes dafür sehen!
Kimvais
2
Dies ist ein langjähriger Pyflakes-Bug. Die Person, die das Problem behebt, erhält ein vom Pyflakes-Autor persönlich signiertes Bier.
Phil Frost

Antworten:

215

Wenn Sie stattdessen flake8 verwenden können, das sowohl Pyflakes als auch den pep8-Checker umschließt, endet eine Zeile mit

# NOQA

(wobei der Abstand signifikant ist - 2 Leerzeichen zwischen dem Ende des Codes und dem #, einem zwischen ihm und dem NOQAText), weist den Prüfer an, alle Fehler in dieser Zeile zu ignorieren.

yrstruly
quelle
Wenn es nur einen Weg gäbe, dies von einem Repo für EL6 zu bekommen :) - Ich denke, ich muss das selbst in eine Drehzahl einwickeln.
Kimvais
13
schön, aber keine Lösung für Pyflakes
Ezdazuzena
7
Tipps: # flake8: noqaWenn Sie diese Zeile hinzufügen, wird flake8 angewiesen, die Validierung für die gesamte Datei zu ignorieren.
Reorx
3
# noqanur ignoriert bestimmte Warnungen / Fehler, aber nicht alle - , um befassen sich mit diesem, beinhaltet eine Abhilfe Installation / das Paket bei Verwendung pypi.python.org/pypi/flake8-respect-noqa
Mark
8
Tipps # noqa: F841bedeutet, nur F841Fehler an der Leitung zu ignorieren .
SangminKim
47

Ich weiß, dass dies vor einiger Zeit in Frage gestellt wurde und bereits beantwortet wurde.

Aber ich wollte hinzufügen, was ich normalerweise benutze:

try:
    import json
    assert json  # silence pyflakes
except ImportError:
    from django.utils import simplejson as json  # Python 2.4 fallback.
mfussenegger
quelle
Genau das haben wir letztendlich getan. (Nun, dies und das Parsen von Pyflakes werden ausgegeben, um Fehler in Zeilen mit einem silence pyflakesKommentar zu ignorieren .) Danke!
Ein bezahlter Nerd
Ich denke, eine assertAussage reicht aus, um den Prüfer in diesem Fall zum Schweigen zu bringen. Netter Trick übrigens.
Anton Strogonoff
Ist das irgendwo dokumentiert?
Håken Deckel
7

Ja, leider ist dimod.org zusammen mit allen Leckereien ausgefallen.

Wenn ich mir den Pyflakes-Code anschaue, scheint es mir, dass Pyflakes so konzipiert sind, dass es einfach ist, ihn als "eingebetteten Schnellprüfer" zu verwenden.

Um die Ignorierfunktion zu implementieren, müssen Sie eine eigene schreiben, die den Pyflakes-Checker aufruft.

Hier finden Sie eine Idee: http://djangosnippets.org/snippets/1762/

Beachten Sie, dass das obige Snippet nur für Kommentare in derselben Zeile steht. Um einen ganzen Block zu ignorieren, möchten Sie möglicherweise 'pyflakes: ignore' in den Block docstring und den Filter basierend auf node.doc einfügen.

Viel Glück!


Ich verwende Pocket-Lint für alle Arten von statischen Code-Analysen. Hier sind die Änderungen, die in Pocket-Lint vorgenommen wurden, um Pyflakes zu ignorieren: https://code.launchpad.net/~adiroiban/pocket-lint/907742/+merge/102882

Adi Roiban
quelle
1
divmod.org ist nicht verfügbar, aber die Extras finden Sie auf dem Launchpad ( code.launchpad.net/divmod.org ).
Thebjorn
6

Um aus dem Github Issue Ticket zu zitieren :

Während das Update noch verfügbar ist, können Sie es wie folgt umgehen, wenn Sie sich fragen:

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

Substitude _unittest und _WritelnDecorator mit den Entitäten (Modulen, Funktionen, Klassen), die Sie benötigen

- deemoowoor

Daenyth
quelle
und _WritelnDecorator;macht absolut nichts, oder? So kann ich diese Pyflakes bekommen verwenden , um nicht verwendete Variablen zu ignorieren, die im Innern tatsächlich verwendet werden eval oder numexpr durch Auflisten der Variablen in einer separaten Zeile Strings? Ist das Semikolon überhaupt notwendig?
Endolith
1
Tatsächlich verwendet dis.disdies anscheinend ein LOAD_FASTund POP_TOPfür jede Variable in einer Zeile für sich (legt es auf den Stapel und entfernt es dann vom Stapel?), Also tut es nichts. Besser als assert.
Endolith
Semikolon nicht erforderlich. Zusicherungen können über den Optimierungsschalter ignoriert werden, sind also nicht völlig nutzlos.
Gringo Suave
6

Hier ist ein Affen-Patch für Pyflakes, der eine # bypass_pyflakesKommentaroption hinzufügt .

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()

Wenn Sie dies als speichern bypass_pyflakes.py, können Sie es als aufrufen python bypass_pyflakes.py myfile.py.

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

Chase Seibert
quelle
Ich bin nicht sicher, was sich geändert hat oder ob ein Fehler im Originalcode aufgetreten ist, aber meine Version von Pyflakes (0.9.2) erfordert text_lineno = args[0] - 1eine Änderung in text_lineno = args[0].lineno - 1. Ich empfehle, diese Antwort zu aktualisieren, um dies widerzuspiegeln.
John Lunzer
1

Sie können auch mit importieren __import__. Es ist nicht pythonisch, aber Pyflakes warnen dich nicht mehr. Siehe Dokumentation für__import__ .

try:
    import json
except ImportError:
    __import__('django.utils', globals(), locals(), ['json'], -1)
mrijken
quelle
40
Ich suche nach einer Möglichkeit, Pyflakes dazu zu bringen, die Fehler zu ignorieren, und nicht nach einer Möglichkeit, meinen Code zu hässlich zu machen :)
Kimvais
Darüber hinaus ist dies keine Lösung, wenn Sie so etwas tunfrom foo import bar
ezdazuzena
0

Ich habe ein kleines Shell-Skript mit etwas awkMagie erstellt, um mir zu helfen. Damit alle Zeilen mit import typing, from typing importoder #$(letzteres ist ein spezieller Kommentar , den ich hier bin mit) sind ausgeschlossen ( $1der Dateiname des Python - Skript):

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 ...

Grundsätzlich werden die Zeilennummern notiert und dynamisch ein Regex daraus erstellt.

phk
quelle