Verwenden Sie die “globale” statement in Python?

Ich las eine Frage über die globale Python-statement ( “Python-Bereich” ) und erinnerte mich daran, wie oft ich diese statement als Python-Anfänger benutzte (ich benutzte global viel) und wie ich heute, Jahre später, nicht mehr weiß benutze es überhaupt nie. Ich halte es sogar für ein bisschen “unpythonisch”.

Verwenden Sie diese statement in Python? Hat sich Ihre Verwendung mit der Zeit verändert?

Ich benutze ‘global’ in einem Kontext wie diesem:

_cached_result = None def myComputationallyExpensiveFunction(): global _cached_result if _cached_result: return _cached_result # ... figure out result _cached_result = result return result 

Ich benutze ‘global’, weil es Sinn macht und dem Leser der function klar ist, was gerade passiert. Ich weiß auch, dass es dieses Muster gibt, das äquivalent ist, aber den Leser kognitiv belastet:

 def myComputationallyExpensiveFunction(): if myComputationallyExpensiveFunction.cache: return myComputationallyExpensiveFunction.cache # ... figure out result myComputationallyExpensiveFunction.cache = result return result myComputationallyExpensiveFunction.cache = None 

Ich hatte nie eine legitime Verwendung für die Aussage in irgendeinem Produktionscode in meinen 3+ Jahren professionellen Einsatzes von Python und über fünf Jahre als Python-Bastler. Jeder Zustand, den ich ändern muss, befindet sich in classn oder, wenn es einen “globalen” Zustand gibt, befindet er sich in einer gemeinsamen Struktur wie ein globaler Cache.

Ich habe es in Situationen verwendet, in denen eine function Variablen erstellt oder setzt, die global verwendet werden. Hier sind einige Beispiele:

 discretes = 0 def use_discretes(): #this global statement is a message to the parser to refer #to the globally defined identifier "discretes" global discretes if using_real_hardware(): discretes = 1 ... 

oder

 file1.py: def setup(): global DISP1, DISP2, DISP3 DISP1 = grab_handle('display_1') DISP2 = grab_handle('display_2') DISP3 = grab_handle('display_3') ... file2.py: import file1 file1.setup() #file1.DISP1 DOES NOT EXIST until after setup() is called. file1.DISP1.resolution = 1024, 768 

Sobald Sie das Gefühl haben, globale Variablen in einem Python-Code verwenden zu müssen, ist es meiner Meinung nach eine gute Gelegenheit, kurz anzuhalten und am Refactoring Ihres Codes zu arbeiten.
Das global in den Code zu schreiben und den Refactoring-process zu verzögern, mag vielversprechend klingen, wenn deine Deadline nahe ist, aber glaub mir, du wirst nicht zurückgehen und es reparieren, es sei denn du musst wirklich – wie dein Code nicht mehr funktioniert Irgendein merkwürdiger Grund, Sie müssen es debuggen, Sie treffen einige dieser global Variablen und alles, was sie tun, ist Dinge durcheinander bringen.

Also, ehrlich gesagt, selbst wenn es erlaubt ist, würde ich es so gut wie möglich vermeiden. Auch wenn es sich um einen einfachen classnaufbau handelt.

Objekte sind die bevorzugte Art, nicht-lokalen Zustand zu haben, so dass global nur selten benötigt wird. Ich denke nicht, dass der bevorstehende nonlocal Modifier auch weit verbreitet sein wird, ich denke, es ist meistens da, um Lisper zum Jammern zu bringen 🙂

Ich verwende es für globale Optionen mit Befehlszeilenskripten und ‘optparse’:

Meine main () analysiert die Argumente und übergibt diese an jede function, die die Arbeit des Skripts erledigt … aber schreibt die gelieferten Optionen in ein globales Wörterbuch ‘opts’.

Shell-Skriptoptionen optimieren häufig das “Blatt” -Verhalten, und es ist unpraktisch (und unnötig), das Wörterbuch ‘opts’ durch jede Argumentliste zu führen.

Ich vermeide es und wir haben sogar eine Pylint- Regel, die das in unserem Produktionscode verbietet. Ich glaube sogar, dass es überhaupt nicht existieren sollte.

Selten. Ich habe noch keinen Nutzen dafür gefunden.

Es kann in Threads für die Freigabe von Status (mit Sperrmechanismen) nützlich sein.

Aber ich werde es selten benutzen.

Ich habe es in schnellen & dreckigen Einweg-Skripten verwendet, um einige einmalige Aufgaben zu automatisieren. Alles, was größer ist als das oder das wiederverwendet werden muss, und ich werde einen eleganteren Weg finden.

Ein-oder zweimal. Aber es war immer ein guter Ausgangspunkt um zu refaktorieren.

Wenn ich es vermeiden kann, nein. Und meines Wissens gibt es immer einen Weg, dies zu vermeiden. Aber ich behaupte nicht, dass es auch völlig nutzlos ist