Wie sage ich PyLint, dass es sich um eine Variable und nicht um eine Konstante handelt, um die Nachricht C0103 zu stoppen?

72

Ich habe eine Variable auf Modulebene in meinem Python 2.6-Programm namens "_log", über die sich PyLint beschwert:

C0103: Invalid name "_log" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)

Nachdem ich diese Antwort gelesen habe, verstehe ich, warum dies so ist: Es glaubt, dass die Variable eine Konstante ist und wendet den konstanten regulären Ausdruck an. Ich bin jedoch anderer Meinung: Ich denke, es ist eine Variable. Wie sage ich PyLint das, damit es sich nicht beschwert? Wie bestimmt PyLint, ob es sich um eine Variable oder eine Konstante handelt? Behandelt es nur alle Variablen auf Modulebene als Konstanten?

EMP
quelle

Antworten:

99
# pylint: disable-msg=C0103

Stellen Sie es in den Bereich, in dem diese Warnungen ignoriert werden sollen. Sie können das Obige auch als Zeilenende-Kommentar festlegen, um die Nachricht nur für diese Codezeile zu deaktivieren.

IIRC Es ist wahr, dass Pylint alle Variablen auf Modulebene als 'Konstanten' interpretiert.

Neuere Versionen von Pylint übernehmen stattdessen diese Linie

# pylint: disable=C0103
ChristopheD
quelle
8
Vielen Dank. Ich habe auch # pylint: enable-msg=C0103danach hinzugefügt, damit der Rest des Codes noch überprüft wird.
EMP
15
Beachten Sie, dass das Platzieren am Ende einer Codezeile diese Nachricht auch nur für diese bestimmte Zeile deaktivieren sollte (dann ist keine erneute Aktivierung erforderlich).
ChristopheD
2
Wo lege ich diesen Code ab, um diese Fehlermeldung in allen meinen Python-Quelldateien zu deaktivieren?
Renatov
IIRC it is true that pylint interprets all module-level variables as being 'constants'.- Warum noch haben sie nicht die Pylint machen die zu differenzieren variableund constants? Gibt es eine technische Herausforderung?
Jai K
@JaiK Nun, es gibt keinen technischen Unterschied zwischen Konstanten und (anderen) Variablen in Python, daher könnte ich mir keinen besseren Weg vorstellen, um die beiden zu unterscheiden ...
lenz
23

Sie können auch eine durch Kommas getrennte Liste von "guten Namen" angeben, die in Ihrem Pylintrc immer zulässig sind, z.

[BASIC]
good-names=_log
AdamR
quelle
16

Mir scheint, ein bisschen Refactor könnte helfen. Pylint betrachtet dies als ein Modul, daher wäre es vernünftig, nicht zu erwarten, dass Variablen auf dieser Ebene angezeigt werden. Umgekehrt beschwert es sich nicht über Vars in Klassen oder Funktionen. Das folgende Paradigma scheint ziemlich verbreitet zu sein und löst das Problem:

def main():
    '''Entry point if called as an executable'''
    _log = MyLog()  # . . .

if __name__ == '__main__':
    main()

Dies hat den Vorteil, dass ich einige nützliche Klassen importieren kann, ohne Ihre Hauptklasse auszuführen. Der __name__ ist der des Moduls, daher schlägt das "if" fehl.

ryszards0.02c
quelle
3
Nicht alle Programme sind Skripte, die eine Hauptfunktion haben, wie z. B. Django urls.py-Dateien.
Andyn
1
Diese Variable existiert nur in der Funktion. Es ist keine Variable auf Modulebene.
Craynic Cai
12

In neueren Versionen von Pylint ist diese Linie jetzt

# pylint: disable=C0103

Die Aktivierungsnachricht ist genauso einfach

# pylint: enable=C0103
studioj
quelle
3

Wie aus anderen Antworten hervorgeht, können Sie eine bestimmte PyLint-Warnung (z. B. C0103) deaktivieren, indem Sie die folgende Zeile einfügen:

# pylint: disable=C0103

Dies erzeugt jedoch die Locally disabling invalid-nameWarnung. Beachten Sie, dass diese sekundäre Warnung nützlich sein kann, wenn Sie an die deaktivierte Warnung erinnert werden möchten. Wenn Sie die Warnung stillschweigend deaktivieren möchten, ohne Ihre Konfigurationsdatei zu ändern (wodurch die Warnung global deaktiviert würde), können Sie Folgendes verwenden:

# pylint: disable=I0011,C0103

Beachten Sie, dass PyLint keine Warnung ausgibt, dass Sie I0011 deaktivieren!

banbh
quelle
2

Wenn Sie eine Nachricht lokal in Ihrer Datei deaktivieren, meldet Pylint eine weitere Warnung!

Locally disabling invalid-name (C0103) [I:locally-disabled] 

Wenn Sie einen sauberen Flusenlauf beabsichtigen und dies sicherlich das Ziel sein sollte, warum stören Sie sich dann, können Sie diese Nachricht und die entsprechende lokal aktivierte Nachricht in Ihrer Konfigurationsdatei deaktivieren:

disable=locally-disabled, locally-enabled
RobG
quelle