Wie deaktiviere ich eine Pylint-Warnung?

266

Ich versuche, die Warnung C0321 ("mehr als eine Anweisung in einer einzelnen Zeile" - ich setze häufig ifAnweisungen mit kurzen einzeiligen Ergebnissen in dieselbe Zeile) in Pylint 0.21.1 zu deaktivieren (wenn es darauf ankommt: astng 0.20). 1, common 0.50.3, Python 2.6.6 (r266: 84292, 15. September 2010, 16:22:56)).

Ich habe versucht, disable=C0321die Pylint-Konfigurationsdatei hinzuzufügen, aber Pylint besteht darauf, sie trotzdem zu melden. Variationen über diese Linie (wie disable=0321oder disable=C321) als Fehler markiert, so Pylint hat die Möglichkeit , richtig zu erkennen, es zu ignorieren es einfach.

Ist das ein Pylint-Fehler oder mache ich etwas falsch? Gibt es einen Weg daran vorbei? Ich würde wirklich gerne etwas von diesem Geräusch loswerden.

Head Geek
quelle
1
Hier gibt es eine gute Lösung, wenn Sie eine einzelne Codezeile deaktivieren möchten, nicht alle Fehler einer Art.
Le Droid

Antworten:

167

pylint --generate-rcfile zeigt es so:

[MESSAGES CONTROL]

# Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option
# multiple time.
#enable=

# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifier separated by comma (,) or put this option
# multiple time (only on the command line, not in the configuration file where
# it should appear only once).
#disable=

Es sieht also so aus, als ob Sie ~/.pylintrcdie disable=Zeile (n) in einem Abschnitt haben sollten [MESSAGES CONTROL].

Chris Morgan
quelle
1
Vielen Dank, aber bereits im Abschnitt [MESSAGES CONTROL] (siehe oben). Immer noch ignoriert.
Head Geek
6
@ Head Geek: Nun, es funktioniert bei mir. ~/.pylintrcmit zwei Zeilen [MESSAGES CONTROL]und disable=C0321. Das verhindert diese Nachricht.
Chris Morgan
Seltsam ... genau die gleiche Version von PyLint?
Head Geek
@ Head Geek: 0.21.3, astng 0.20.3 und häufig 0.52.1 tatsächlich (das späteste, als ich es installiert habe, aktueller als deins)
Chris Morgan
1
@ Chris Morgan: Ah. Wahrscheinlich ein Fehler, der bereits behoben wurde - ich verwende die Version aus dem Ubuntu-Repository. Vielen Dank!
Head Geek
165

Ich hatte dieses Problem mit Eclipse und löste es wie folgt:

Halten Sie im Pylint-Ordner (z. B. C:\Python26\Lib\site-packages\pylint) die Umschalttaste gedrückt , klicken Sie mit der rechten Maustaste und wählen Sie, um den Windows-Befehl in diesem Ordner zu öffnen. Art:

lint.py --generate-rcfile > standard.rc

Dadurch wird die standard.rcKonfigurationsdatei erstellt. Öffnen Sie es im Editor und darunter [MESSAGES CONTROL], kommentieren Sie es aus disable=und fügen Sie die Nachrichten-IDs hinzu, die Sie deaktivieren möchten, z.

disable=W0511, C0321

Speichern Sie die Datei und geben Sie unter Eclipse-> Fenster-> Einstellungen-> PyDev-> Pylint im Feld Argumente Folgendes ein:

--rcfile=C:\Python26\Lib\site-packages\pylint\standard.rc

Jetzt sollte es funktionieren ...


Sie können auch oben in Ihrem Code einen Kommentar hinzufügen , der von pylint interpretiert wird:

# pylint: disable=C0321

Link zu allen Pylint-Nachrichtencodes


Das Hinzufügen von zB --disable-ids=C0321in das Argumentfeld funktioniert nicht. Alle verfügbaren Pylint-Nachrichten werden im Wörterbuch gespeichert _messages, einem Attribut einer Instanz der pylint.utils.MessagesHandlerMixInKlasse. Wenn Sie pylint mit dem Argument ausführen --disable-ids=...(zumindest ohne Konfigurationsdatei), ist dieses Wörterbuch zunächst leer, wodurch eine KeyError-Ausnahme innerhalb von pylint (ausgelöst wird pylint.utils.MessagesHandlerMixIn.check_message_id(). In Eclipse wird diese Fehlermeldung in der Pylint-Konsole angezeigt (Fenster - Ansicht anzeigen - Konsole) Wählen Sie neben dem Konsolensymbol aus den Konsolenoptionen die Option Pylint-Konsole aus.)

Remi
quelle
2
Nein, das sollte es wirklich nicht. 1) Es verweist auf Eclipse, was für die gestellte Frage irrelevant ist. 2) Es wird empfohlen, die Legacy-Nachrichtencodes zu deaktivieren. Ich würde meine Antwort für die einfachste Lösung des Problems oder Chris Johnsons Antwort für weitere Details empfehlen .
Imolit
153

Ab Pylint Version 0.25.3 können Sie die symbolischen Namen zum Deaktivieren von Warnungen verwenden, anstatt sich alle diese Codenummern merken zu müssen . Z.B:

# pylint: disable=locally-disabled, multiple-statements, fixme, line-too-long

Dieser Stil ist lehrreicher als kryptische Fehlercodes und auch praktischer, da neuere Versionen von Pylint nur den symbolischen Namen und nicht den Fehlercode ausgeben.

Die Entsprechung zwischen symbolischen Namen und Codes finden Sie hier .

Ein Deaktivierungskommentar kann in einer eigenen Zeile eingefügt werden, wobei die Deaktivierung auf alles angewendet wird, was im selben Block folgt. Alternativ kann es am Ende der Zeile eingefügt werden, für die es gelten soll.

Wenn Pylint Ausgänge „ Locally disabling“ -Nachrichten, können Sie sie loswerden , indem die Sperr locally-disabled ersten wie im Beispiel oben.

imolit
quelle
20
Aber # pylint: disable=foowenn ich inlyne setze , bin ich zu lang, also muss ich jetzt hinzufügen , line-too-long! Zunge in der Wange; Das war es, was ich brauchte und mein Problem löst. Vielen Dank!
Dwanderson
Liste mit den tatsächlich zu verwendenden Zeichenfolgen: gist.github.com/m451/965bb613177dd4fa896b815aa0e0e365
masi
81

Fügen Sie hinzu, um eine Warnung lokal in einem Block zu deaktivieren

# pylint: disable=C0321

zu diesem Block.

Thakis
quelle
5
Dies ist eine Legacy-Technik und wird nicht mehr empfohlen. Siehe die anderen Antworten.
Acumenus
1
Du meinst, man sollte den symbolischen Namen anstelle der Codenummer verwenden, ja?
Thakis
5
Ja. Die Antwort von imolit deckt genau dies ab.
Acumenus
2
Wie findet man den symbolischen Namen? Mein Editor wird ausspucken [pylint] C0111: Missing method docstring, daher ist es einfach, die Codenummer zu finden, aber wenn ich den symbolischen Namen finde, muss ich ihn nachschlagen.
Adam Parkin
@ AdamParkin Ich fand meine Nachrichten hier: pylint-messages.wikidot.com/all-messages
Jean-Francois T.
80

Es gibt verschiedene Möglichkeiten, Warnungen und Fehler von Pylint zu deaktivieren. Welche zu verwenden ist, hängt davon ab, wie global oder lokal Sie die Deaktivierung anwenden möchten - eine wichtige Entwurfsentscheidung.

Mehrere Ansätze

  1. In einer oder mehreren pylintrcDateien.

Dies betrifft mehr als die ~/.pylintrcvon Chris Morgan beschriebene Datei (in Ihrem $ HOME-Verzeichnis). Pylint sucht nach RC-Dateien mit einer Priorität, die "nähere" Dateien höher bewertet:

  • Eine pylintrcDatei im aktuellen Arbeitsverzeichnis; oder

  • Befindet sich das aktuelle Arbeitsverzeichnis in einem Python-Modul (dh es enthält eine __init__.pyDatei), durchsuchen Sie die Hierarchie der Python-Module, bis eine pylintrcDatei gefunden wurde. oder

  • Die von der Umgebungsvariablen PYLINTRC benannte Datei; oder

  • Wenn Sie ein Home-Verzeichnis haben, das nicht /root:

    • ~/.pylintrc;; oder

    • ~/.config/pylintrc;; oder

    • /etc/pylintrc

Beachten Sie, dass die meisten dieser Dateien benannt sind pylintrc- nur die Datei in ~hat einen führenden Punkt.

pylintrcFügen Sie Ihrer Datei Zeilen hinzu, um bestimmte Pylint-Nachrichten zu deaktivieren. Zum Beispiel:

[MESSAGES CONTROL]
disable=locally-disabled
  1. Weitere Deaktivierungen über die pylintBefehlszeile, wie von Aboo und Cairnarvon beschrieben. Das sieht so aus pylint --disable=bad-builtin. Wiederholen Sie diesen Vorgang --disable, um weitere Elemente zu unterdrücken.

  2. Weitere Deaktivierungen einzelner Python-Codezeilen, wie von Imolit beschrieben. Diese sehen aus wie some statement # pylint: disable=broad-except(zusätzlicher Kommentar am Ende der ursprünglichen Quellzeile) und gelten nur für die aktuelle Zeile . Mein Ansatz ist es, diese immer am Ende anderer Codezeilen zu platzieren, damit sie nicht mit dem Blockstil verwechselt werden (siehe unten).

  3. Weitere Deaktivierungen, die für größere Python-Codeblöcke definiert wurden, bis hin zur Vervollständigung der Quelldateien.

    • Diese sehen aus wie # pragma pylint: disable=bad-whitespace(beachten Sie das pragmaSchlüsselwort).

    • Diese gelten für jede Zeile nach dem Pragma. Wenn Sie einen Block davon oben in eine Datei einfügen, werden die Unterdrückungen auf die gesamte Datei angewendet. Wenn Sie denselben Block tiefer in die Datei einfügen, gelten sie nur für Zeilen, die dem Block folgen. Mein Ansatz ist es, diese immer in eine eigene Zeile zu setzen, damit sie nicht mit dem einzeiligen Stil verwechselt werden (siehe oben).

    • Wenn eine Unterdrückung nur innerhalb eines Codebereichs angewendet werden soll, verwenden Sie # pragma pylint: enable=bad-whitespace(jetzt enablenicht disable), um die Unterdrückung zu beenden.

Beachten Sie, dass beim Deaktivieren für eine einzelne Zeile die # pylintSyntax verwendet wird, während beim Deaktivieren für diese Zeile die Syntax verwendet wird# pragma pylint Syntax verwendet wird. Diese sind besonders beim Kopieren und Einfügen leicht zu verwechseln.

Alles zusammenfügen

Normalerweise verwende ich eine Mischung dieser Ansätze.

  • Ich verwende ~/.pylintrcfür absolut globale Standards - sehr wenige davon.

  • Ich verwende Projektebene pylintrcauf verschiedenen Ebenen innerhalb von Python-Modulen, wenn es projektspezifische Standards gibt. Insbesondere wenn Sie Code von einer anderen Person oder einem anderen Team aufnehmen, werden möglicherweise Konventionen verwendet, die Sie nicht bevorzugen, die Sie jedoch nicht überarbeiten möchten. Wenn Sie die Einstellungen auf diesem Niveau halten, können Sie diese Vorgehensweisen nicht auf andere Projekte übertragen.

  • Ich verwende die Blockstil-Pragmas oben in einzelnen Quelldateien. Ich mag es, die Pragmas in der Hitze der Entwicklung auszuschalten (keine Nachrichten mehr zu unterdrücken), selbst für Pylint-Standards, denen ich nicht zustimme (wie "zu wenige öffentliche Methoden" - ich bekomme diese Warnung immer bei benutzerdefinierten Ausnahmeklassen) - aber Es ist hilfreich, während der Entwicklung mehr / möglicherweise alle Pylint-Nachrichten anzuzeigen. Auf diese Weise können Sie die Fälle finden, die Sie mit einzeiligen Pragmas behandeln möchten (siehe unten), oder einfach Kommentare für den nächsten Entwickler hinzufügen, um zu erklären, warum diese Warnung in diesem Fall in Ordnung ist.

  • Ich lasse einige der Pragmas im Blockstil aktiviert, auch wenn der Code zum Einchecken bereit ist. Ich versuche, einige davon zu verwenden, aber wenn es für das Modul sinnvoll ist, ist es in Ordnung, dies als Dokumentation zu tun. Ich versuche jedoch, so wenig wie möglich zu belassen, vorzugsweise keine.

  • Ich verwende den einzeiligen Kommentarstil, um besonders starke Fehler zu beheben. Wenn es zum Beispiel einen Ort gibt, an dem es tatsächlich Sinn macht, dies zu tun except Exception as exc, setze ich # pylint: disable=broad-exceptdiesen Punkt anstelle eines globaleren Ansatzes ein, da dies eine seltsame Ausnahme darstellt und im Grunde genommen als Dokumentationsform aufgerufen werden muss.


Wie alles andere in Python können Sie auf verschiedenen Indirektionsebenen agieren. Mein Rat ist, darüber nachzudenken, was auf welcher Ebene gehört, damit Sie nicht zu nachsichtig mit Pylint umgehen.

Chris Johnson
quelle
1
Beste Antwort, ähnlich wie stackoverflow.com/questions/16266452/…
Christophe Roussy
1
Zum größten Teil kann ich nicht befürworten, eine globale Nicht-Leere zu verwenden ~/.pylintrc. IMHO sollte die Konfiguration normalerweise an das Projekt gebunden sein und sich daher irgendwo im Projekt befinden. Nur dann kann es versioniert und mit dem Projekt geteilt werden. Andernfalls fehlen einem Klon möglicherweise die Anpassungen, die erforderlich sind, damit Pylint ohne Drucken von Nachrichten beendet wird.
Acumenus
@ABB Ich denke, das ist klug
Chris Johnson
3
@ChrisJohnson Das Präfix pragma scheint völlig unnötig. Zum Beispiel habe ich # pylint: disable=missing-docstringoben in meiner Datei, und es gilt für den gesamten Rest der Datei. Bitte überprüfen Sie das pragmaPräfix und entfernen Sie es aus Ihrer Antwort.
Acumenus
Pylint FAQ schreibt nicht über Pragma. ( pylint.pycqa.org/en/latest/… ): Sie können Nachrichten auf Modulebene deaktivieren oder aktivieren (global deaktiviert), indem Sie die entsprechende Option in einem Kommentar oben in der Datei hinzufügen: # pylint: disable = wildcard- import, method-hidden # pylint: enable = zu viele Zeilen
Yaroslav Nikitenko
18

Sie können auch den folgenden Befehl verwenden:

pylint --disable=C0321  test.py

Meine Pylint-Version ist 0.25.1.

aboo
quelle
Dies ist jetzt eine Legacy-Technik. Stattdessen wird die Verwendung des symbolischen Namens der deaktivierten Warnung empfohlen. Siehe diese Antwort .
Acumenus
Dies scheint auch nicht mit der --py3kFlagge zu funktionieren :(
DylanYoung
Interessanterweise funktioniert rces einwandfrei, wenn es in der Datei enthalten ist, und (beunruhigender) es generiert tatsächlich eine korrekte rcDatei mit --generate-rcfile. Ich muss Code mit mehreren Zweigen lieben, die dasselbe tun :(
DylanYoung
18

Dies ist eine FAQ :

4.1 Ist es möglich, eine bestimmte Nachricht lokal zu deaktivieren?

Ja, diese Funktion wurde in Pylint 0.11 hinzugefügt. Dies kann durch Hinzufügen
# pylint: disable=some-message,another-oneauf der gewünschten Blockebene oder am Ende der gewünschten Codezeile erfolgen.

4.2 Gibt es eine Möglichkeit, eine Nachricht nur für ein bestimmtes Modul zu deaktivieren?

Ja, Sie können Nachrichten auf Modulebene deaktivieren oder aktivieren (global deaktiviert), indem Sie die entsprechende Option in einem Kommentar oben in der Datei hinzufügen:

# pylint: disable=wildcard-import, method-hidden
# pylint: enable=too-many-lines

Sie können Nachrichten deaktivieren, indem Sie:

  • numerische ID : E1101,E1102 usw.
  • symbolische Botschaft: no-member, undefined-variableusw.
  • der Name einer Gruppe von Schecks. Sie können diese mit greifen pylint --list-groups.
  • Kategorie der Kontrollen: C, R, Wetc.
  • alle Schecks mit all.

Die vollständige Liste der Nachrichten finden Sie in den Dokumenten (oder pylint --list-msgsim Terminal ausführen ) pylint. Die Dokumente bieten auch ein schönes Beispiel für die Verwendung dieser Funktion.

Eugene Yarmash
quelle
5

Sie müssen nur eine Zeile hinzufügen, um das zu deaktivieren, was Sie deaktivieren möchten. Z.B

#pylint: disable = line-too-long, too-many-lines, no-name-in-module, import-error, multiple-imports, pointless-string-statement, wrong-import-order

Fügen Sie dies an # 1 in Ihrem Modul hinzu

Chetan Malhotra
quelle
4

Wenn dies jemandem hilft, wenn Sie Visual Studio Code verwenden, wird erwartet, dass die Datei in UTF8-Codierung vorliegt. Um die Datei zu generieren, habe ich pylint --generate-rcfile | out-file -encoding utf8 .pylintrcin PowerShell ausgeführt.

Elijah W. Gagne
quelle
0

Wie pro Pylint Dokumentation, ist die einfachste diese verwenden Chart :

  • C Konventionsbezogene Prüfungen
  • R Refactoring-bezogene Prüfungen
  • W verschiedene Warnungen
  • E-Fehler für wahrscheinliche Fehler im Code
  • F fatal, wenn ein Fehler aufgetreten ist, der die weitere Verarbeitung von Pylint verhindert hat.

So kann man verwenden:

pylint -j 0 --disable=I,E,R,W,C,F YOUR_FILES_LOC
Arindam Roychowdhury
quelle
-1

Die Python-Syntax erlaubt mehr als eine Anweisung in einer Zeile, die durch ein Semikolon (;) getrennt ist. Die Beschränkung jeder Zeile auf eine Anweisung erleichtert es einem Menschen jedoch, beim Lesen der Logik eines Programms zu folgen.

Eine andere Möglichkeit, dieses Problem zu lösen, besteht darin, zu verstehen, warum die Flusenmeldung vorhanden ist, und nicht mehr als eine Aussage in eine Zeile zu setzen.

Ja, es fällt Ihnen möglicherweise leichter, mehrere Anweisungen pro Zeile zu schreiben. Pylint gilt jedoch für jeden anderen Leser Ihres Codes, nicht nur für Sie.

hrf
quelle
-1

Vielleicht möchten Sie dies versuchen:

Bearbeiten Sie "C: \ Benutzer \ Ihr Benutzer \ AppData \ Roaming \ Code \ Benutzer \ settings.json" und fügen Sie python.linting.pylintArgsam Ende Zeilen hinzu , wie unten gezeigt:

{
    "team.showWelcomeMessage": false,
    "python.dataScience.sendSelectionToInteractiveWindow": true,
    "git.enableSmartCommit": true,
    "powershell.codeFormatting.useCorrectCasing": true,
    "files.autoSave": "onWindowChange",
    "python.linting.pylintArgs": [
        "--load-plugins=pylint_django",
        "--errors-only"
    ],
}
aarw76
quelle