Globales Python-Schlüsselwort im Vergleich zu Pylint W0603

8

Pylint W0603 gibt an:

  

Verwenden der globalen Anweisung. Wird verwendet, wenn Sie die Anweisung "global" verwenden   Aktualisieren Sie eine globale Variable. PyLint versucht nur, diese Verwendung zu verhindern.   Das bedeutet nicht, dass du es nicht benutzen kannst!

Ich frage mich, warum ist es so? Gibt es noch eine pythonische Methode, unveränderliche modulweite Variablen innerhalb einer Funktion zu modifizieren? Ist es empfehlenswert, sie in veränderbare Variablen wie Wörterbücher zu packen? Oder vielleicht ganzes Modul in Klasse verwandeln?

Meiner Meinung nach sollte diese Warnung verschwinden, wenn eine Variable als "privat" (mit _ oder __ vorangestellt) vorgeschlagen wird.

    
Jovik 24.01.2013, 14:44
quelle

3 Antworten

16

Die generelle Verwendung von globalen Variablen kann die Wartung zu einem Albtraum machen, da sie den Ablauf Ihres Programms verfolgen und manchmal einen seltsamen Bug bekommen, weil ein Modul die Variable gelesen und auf ihren Wert reagiert hat, bevor ein anderes Modul den Wert geändert hat der Variablen (und dies kann aus der Invertierung von zwei Importanweisungen in einem nicht verwandten dritten Modul resultieren). Siehe auch den Wikipedia-Eintrag zu globalen Variablen .

Deshalb sollten Sie veränderbare globale Variablen, IMO, vermeiden und warum Pylint eine Warnung ausgibt (und wahrscheinlich mehr davon ausgeben sollte. Die Verwendung des global Schlüsselworts zu erkennen ist nur eine einfache Möglichkeit einige von ihnen zu entdecken) .

Versteh mich nicht falsch: Ich sage nicht, dass du keine globalen Variablen verwenden darfst. Nur dass du sie vermeiden solltest. Es gibt viele legitime Fälle für globale Variablen in Python. Solange du nicht mehr als ein paar W0603 bekommst, solltest du OK sein.

Nun, Logilab (die Firma, die Pylint unterhält und wo ich früher gearbeitet habe) musste einmal die Wartung eines Stückes von & gt; 50kloc Python-Code mit schwerer Duplizierung und über 100 veränderbaren globalen Variablen. Und das war die Hölle.

Zu den Lösungen für die Arbeit mit globalen Variablen gehören:

  • Hinzufügen eines Parameters zu den Funktionen, die auf die Variable
  • zugreifen müssen
  • unter Verwendung von Klassenattributen
  • Verwenden von Instanzattributen (durch Übergeben des Werts, den Sie an den Konstruktor der Klasse benötigen)
  • Zentralisierbare veränderbare globale Werte in einem Configuration-Objekt, das so erstellt wird, dass es beim Programmstart (unter Verwendung von Umgebungsvariablen, Befehlszeile, Konfigurationsdatei ...) instanziiert und danach nie mutiert wird.
gurney alex 24.01.2013, 16:00
quelle
3

Ich würde das ersetzen:

%Vor%

mit diesem:

%Vor%

Man könnte sagen: "Das ist zu kompliziert für meine einfache Aufgabe!" OK, dann starte pylint nicht in deinem Programm. Sie können nicht fragen, dass pylint verstehen, dass Ihr Programm zu klein ist, um eine gute Struktur zu verwenden.

    
Ned Batchelder 24.01.2013 16:18
quelle
0

In Python ist ein Modul, das globale Daten teilt, so ziemlich ein Singleton. Sie könnten das gleiche mit einer singleton -Klasse erreichen oder sich fragen, ob es einen Grund gibt, warum Sie tatsächlich einen Singleton brauchen . Wenn Sie einen Singleton nicht brauchen brauchen Sie eine reguläre Klasse (Instanz). Wenn Sie brauchen ein Singleton, google / search SO, um herauszufinden, welches Muster Ihrer Meinung nach am besten zu Ihnen passt. Vielleicht möchtest du ein Modul - es gibt eine Nische für global - Sonst hätte Guido es vor langer Zeit aus der Sprache gestrichen - diese Nische ist einfach nur klein ...

    
mgilson 24.01.2013 15:07
quelle