Pylint mag keine Variablen auf Modulebene?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

Moin

Ich habe soeben mal Pylint über eine Datei laufen lassen, und das ist z.B. das hier 'rausgekommen:

Code: Alles auswählen

Invalid name, (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
Ich schliesse daraus, das der Autor von Pylint nur Konstanten auf Modulebene wünscht und keine Variablen. Nun frage ich mich: weshalb? Soweit ich weiss, hat Pylint kein Absolutheits- bzw Gültigkeitsanspruch - es repräsentiert also möglicherweise bloss die persönliche Präferenz des Autors.

Was denkt ihr darüber?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Die Konsequenz von variablen Namen ist, dass sie nur per `global` oder eben durch Code auf Modulebene. Für ersteres gibt es gute Gruende das zu vermeiden, letzteres sollte bei Bibliotheken nicht vorkommen.

Die Regel macht damit fuer mich Sinn. Natuerlich hat pylint keinen Anspruch, es ist nur ein Tool, das dem Benutzer helfen soll, deshalb kann man einzelne Checker ja auch abschalten, wenn sie einem nicht gefallen ;)
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

Deinen ersten Satz verstehe ich nicht.

Nun, vielleicht hatte ich das etwas schlecht formuliert: Ich nutze keine Variablen auf Modulebene in diesem Sinne. Ich stelle bloss gewisse Funktionen/Klassen/Module als "Attribute" des Pakets bereit, also "just for convenience" und um die Benutzung intuitiver zu gestalten. (Schrecklicher Satz, ich hoffe man versteht ihn) Ich benutze also keine globalen Variablen.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

syntor hat geschrieben:Deinen ersten Satz verstehe ich nicht.
Kein Wunder, da hat jemand ein "veraendert werden koennen" am Ende des Satzes geklaut :roll:

Ok jetzt verstehe ich dein Problem. `pylint` ist eben ein "dummes" Tool, weil es nicht zurueckverfolgt, dass es sich hier nur um Shortcuts handelt. Andererseits hat man bei Python im Allgemeinen schlechte Karten wenn man das versucht ohne den Code auszufuehren.
Mit anderen Worten: `pytlint` hat hier nur die Konventionen an der Hand und erzeugt hier eben false positives. Schade, dass man die Checker nicht auf Datei-Basis ausschalten kann (zumindest hab ich auf die schnelle nichts gefunden).
BlackJack

@syntor: Kannst Du mal ein konkretes Beispiel geben?

Es sollten dort halt keine *Variablen* stehen, sondern nur Konstanten. Wo die `pylint`-Meldung "unberechtigt" kommt, sind halt Konstanten die nicht den Namenskonventionen für Konstanten folgen, auch wenn das aus gutem Grund geschieht. Zum Beispiel dynamisch erstellte Funktionen wo `pylint` nicht erkennt, dass man da eine Funktion ohne ``def`` definiert hat, zum Beispiel wenn man eine Funktion mittels `partial()` auf Modulebene erstellt. Oder Typen/Klassen die nicht mit ``class``, sondern zum Beispiel mit `collections.namedtuple()` erzeugt wurden. Da kann man mit einem entsprechenden Kommentar `pylint` in diesen Einzelfällen gezielt das Meckern abgewöhnen.

@cofi: Du kannst einzelne Checks sogar auf "Block" oder Zeilenbasis ausschalten.
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

@BlackJack: ziemlich genau das, was du als Beispiel gegeben hast und vergleichbare Dinge.

Danke für die Antworten!

Wie würde ich denn bestimmte Checks auf einer gewissen Ebene abschalten?
Benutzeravatar
Jerry
User
Beiträge: 13
Registriert: Freitag 29. Oktober 2010, 15:00

Ich schmeiss mal einen Link in den Raum: http://www.logilab.org/card/pylint_manu ... es-control
Nur weil ich paranoid bin, heisst das noch lange nicht, dass ich nicht verfolgt werde!
Antworten