Ich glaube, dass es viele Umstände gibt, in denen es sinnvoll ist und es vereinfacht die Programmierung, einige Globals zu haben, die über mehrere (eng gekoppelte) Module bekannt sind.In diesem Sinne möchte ich ein wenig auf die Idee eingehen, ein globales Modul zu haben, das von jenen Modulen importiert wird, die darauf verweisen müssen.
Wenn es nur ein solches Modul gibt, nenne ich es "g". Darin weise ich Standardwerte für jede Variable zu, die ich als global behandeln möchte. In jedem Modul, das eines davon verwendet, verwende ich nicht "from g import var", da dies nur zu einer lokalen Variable führt, die erst zum Zeitpunkt des Imports von g initialisiert wird. Ich mache die meisten Referenzen in der Form g.var, und die "g." dient als ständige Erinnerung daran, dass es sich um eine Variable handelt, die potenziell für andere Module zugänglich ist.
Wenn der Wert einer solchen globalen Variablen in einer Funktion in einem Modul häufig verwendet werden soll, kann diese Funktion eine lokale Kopie erstellen: var = g.var. Es ist jedoch wichtig zu wissen, dass Zuordnungen zu var lokal sind und global g.var nicht aktualisiert werden kann, ohne explizit g.var in einer Zuweisung zu referenzieren.
Beachten Sie, dass Sie auch mehrere solcher Globals-Module haben können, die von verschiedenen Untergruppen Ihrer Module gemeinsam genutzt werden, um die Dinge ein wenig genauer zu kontrollieren. Der Grund, warum ich kurze Namen für meine Globals-Module verwende, besteht darin, den Code nicht zu sehr mit Vorkommnissen zu überladen. Mit nur ein wenig Erfahrung werden sie mit nur 1 oder 2 Zeichen mnemonisch genug.
Es ist immer noch möglich, z. B. g.x eine Zuweisung zu machen, wenn x noch nicht in g definiert wurde, und ein anderes Modul kann dann auf g.x zugreifen. Auch wenn der Dolmetscher es erlaubt, ist dieser Ansatz nicht so transparent, und ich vermeide es. Es besteht immer noch die Möglichkeit, versehentlich eine neue Variable in g zu erstellen, die auf einen Tippfehler im Variablennamen für eine Zuweisung zurückzuführen ist. Manchmal ist eine Untersuchung von dir (g) nützlich, um irgendwelche Überraschungsnamen zu entdecken, die durch einen solchen Unfall entstanden sein könnten.
Irgendein Grund, dass Sie diese Situation nicht mögen? –
Zum einen bricht es die Erwartungen der Menschen, wenn sie Code lesen. "Was ist das 'foo' Symbol hier verwendet? Warum kann ich nicht sehen, wo es definiert ist?" –
Es kann auch Schaden anrichten, wenn eine zukünftige Version von Python den von Ihnen gewählten Namen als tatsächlichen eingebauten Namen verwendet. – intuited