Wie erstelle ich eine modulübergreifende Variable?

Lesezeit: 6 Minuten

Wie erstelle ich eine modulubergreifende Variable
Dan Homerick

Der __debug__ Die Variable ist zum Teil praktisch, weil sie jedes Modul betrifft. Wenn ich eine andere Variable erstellen möchte, die auf die gleiche Weise funktioniert, wie würde ich das tun?

Die Variable (lassen Sie uns originell sein und sie „foo“ nennen) muss nicht wirklich global sein, in dem Sinne, dass, wenn ich foo in einem Modul ändere, sie in anderen aktualisiert wird. Es wäre in Ordnung, wenn ich foo setzen könnte, bevor ich andere Module importiere, und dann würden sie den gleichen Wert dafür sehen.

1644072428 256 Wie erstelle ich eine modulubergreifende Variable
jfs

Wenn Sie eine globale modulübergreifende Variable benötigen, reicht möglicherweise eine einfache globale Variable auf Modulebene aus.

a.py:

var = 1

b.py:

import a
print a.var
import c
print a.var

c.py:

import a
a.var = 2

Prüfen:

$ python b.py
# -> 1 2

Beispiel aus der Praxis: Djangos global_settings.py (obwohl in Django-Apps Einstellungen verwendet werden, indem die Objekt django.conf.settings).

  • Besser, weil es mögliche Namespace-Konflikte vermeidet

    – bgw

    31. Oktober 10 um 1:45 Uhr

  • Was ist, wenn das Modul, das Sie importieren, in diesem Fall a.pyenthält main()? Spielt es eine Rolle?

    – sedeh

    22. August 14 um 18:11 Uhr

  • @sedeh: nein. Wenn a.py auch als Skript ausgeführt wird, verwenden Sie if __name__=="__main__" guard darin, um zu vermeiden, dass beim Importieren unerwarteter Code ausgeführt wird.

    – jfs

    23. August 14 um 12:31 Uhr

  • In der realen Welt muss man mit dieser Lösung etwas vorsichtig sein. Wenn ein Programmierer Ihre „globale“ Variable mithilfe von „aus einer Importvariable“ aufnimmt (probieren Sie diese Variante in c.py aus), erhält er zum Zeitpunkt des Imports eine Kopie der Variablen.

    – Paul Whip

    28. Juli 15 um 23:36 Uhr

  • @PaulWhipp: falsch (Tipp: verwenden id() zur Identitätsprüfung)

    – jfs

    28. Juli 15 um 23:38 Uhr

1644072428 301 Wie erstelle ich eine modulubergreifende Variable
Curt Hagenlocher

Ich befürworte diese Lösung in keiner Weise, Gestalt oder Form. Aber wenn Sie eine Variable zu der hinzufügen __builtin__ Modul, es wird zugänglich sein, als ob ein globales von jedem anderen Modul, das enthält __builtin__ — was standardmäßig alle sind.

a.py enthält

print foo

b.py enthält

import __builtin__
__builtin__.foo = 1
import a

Das Ergebnis ist, dass “1” gedruckt wird.

Bearbeiten: Der __builtin__ Modul steht als lokales Symbol zur Verfügung __builtins__ — das ist der Grund für die Diskrepanz zwischen zwei dieser Antworten. Beachte das auch __builtin__ wurde umbenannt in builtins in Python3.

  • Gibt es einen Grund, warum Sie diese Situation nicht mögen?

    – Softwarebegeistert

    5. August 10 um 14:32 Uhr

  • Zum einen bricht es die Erwartungen der Leute, wenn sie Code lesen. “Was wird hier für dieses ‘foo’-Symbol verwendet? Warum kann ich nicht sehen, wo es definiert ist?”

    – Curt Hagenlocher

    6. August 10 um 5:05 Uhr

  • Es ist auch anfällig für Chaos, wenn eine zukünftige Version von Python beginnt, den von Ihnen gewählten Namen als tatsächliches Builtin zu verwenden.

    – intuitiv

    12. Oktober 10 um 1:20 Uhr

  • Dies ist eine nette Lösung für Dinge wie die gemeinsame Nutzung einer DB-Verbindung mit importierten Modulen. Als Plausibilitätsprüfung stelle ich sicher, dass das importierte Modul bestätigt wird hasattr(__builtin__, "foo").

    – Mike Ellis

    17. Januar 12 um 22:52 Uhr


  • Für alle, die diese Antwort lesen: NICHT! TUN ! DIES ! Wirklich nicht.

    – bruno desthuilliers

    18. Januar 18 um 11:09 Uhr


Definieren Sie ein Modul (nennen Sie es “globalbaz” ) und lassen Sie die Variablen darin definieren. Alle Module, die dieses “pseudoglobal” verwenden, sollten das Modul “globalbaz” importieren und mit “globalbaz.var_name” darauf verweisen.

Dies funktioniert unabhängig vom Ort der Änderung, Sie können die Variable vor oder nach dem Import ändern. Das importierte Modul verwendet den neuesten Wert. (Ich habe dies in einem Spielzeugbeispiel getestet)

Zur Verdeutlichung sieht globalbaz.py genau so aus:

var_name = "my_useful_string"

Wie erstelle ich eine modulubergreifende Variable
David Vanderschel

Ich glaube, dass es viele Umstände gibt, unter denen es Sinn macht und die Programmierung vereinfacht, einige Globals zu haben, die über mehrere (eng gekoppelte) Module hinweg bekannt sind. In diesem Sinne möchte ich ein wenig auf die Idee eingehen, ein Modul mit Globals zu haben, das von den Modulen importiert wird, die darauf verweisen müssen.

Wenn es nur ein solches Modul gibt, nenne ich es “g”. Darin weise ich jeder Variable, die ich als global behandeln möchte, Standardwerte zu. In jedem Modul, das eines davon verwendet, verwende ich nicht “from g import var”, da dies nur zu einer lokalen Variablen führt, die nur zum Zeitpunkt des Imports von g initialisiert wird. Ich mache die meisten Referenzen in der Form g.var und das “g”. dient als ständige Erinnerung daran, dass ich es mit einer Variablen zu tun habe, auf die möglicherweise andere Module zugreifen können.

Wenn der Wert einer solchen globalen Variablen häufig in einer Funktion in einem Modul verwendet werden soll, kann diese Funktion eine lokale Kopie erstellen: var = g.var. Es ist jedoch wichtig zu wissen, dass Zuweisungen an var lokal sind und die globale g.var nicht aktualisiert werden kann, ohne g.var explizit in einer Zuweisung zu referenzieren.

Beachten Sie, dass Sie auch mehrere solcher Globals-Module haben können, die von verschiedenen Teilmengen Ihrer Module gemeinsam genutzt werden, um die Dinge etwas strenger zu kontrollieren. Der Grund, warum ich kurze Namen für meine Globals-Module verwende, ist, den Code nicht zu sehr mit Vorkommen von ihnen zu überladen. Mit nur wenig Erfahrung werden sie mit nur 1 oder 2 Zeichen mnemonisch genug.

Es ist immer noch möglich, eine Zuweisung an beispielsweise gx vorzunehmen, wenn x nicht bereits in g definiert wurde, und ein anderes Modul kann dann auf gx zugreifen. Obwohl der Interpreter dies zulässt, ist dieser Ansatz jedoch nicht so transparent, und ich vermeide es es. Es besteht immer noch die Möglichkeit, durch einen Tippfehler im Variablennamen einer Zuweisung versehentlich eine neue Variable in g anzulegen. Manchmal ist eine Untersuchung von dir(g) nützlich, um irgendwelche überraschenden Namen zu entdecken, die durch einen solchen Zufall entstanden sein könnten.

Sie können die Globals eines Moduls an ein anderes weitergeben:

Im Modul A:

import module_b
my_var=2
module_b.do_something_with_my_globals(globals())
print my_var

In Modul B:

def do_something_with_my_globals(glob): # glob is simply a dict.
    glob["my_var"]=3

1644072429 864 Wie erstelle ich eine modulubergreifende Variable
spiv

Globale Variablen sind normalerweise eine schlechte Idee, aber Sie können dies tun, indem Sie sie zuweisen __builtins__:

__builtins__.foo = 'something'
print foo

Außerdem sind Module selbst Variablen, auf die Sie von jedem Modul aus zugreifen können. Wenn Sie also ein Modul mit dem Namen my_globals.py:

# my_globals.py
foo = 'something'

Dann können Sie das auch von überall aus verwenden:

import my_globals
print my_globals.foo

Module verwenden statt modifizieren __builtins__ ist im Allgemeinen eine sauberere Art, Globals dieser Art durchzuführen.

1644072429 976 Wie erstelle ich eine modulubergreifende Variable
intuitiv

Sie können dies bereits mit Variablen auf Modulebene tun. Module sind gleich, egal aus welchem ​​Modul sie importiert werden. So können Sie die Variable zu einer Variablen auf Modulebene in jedem Modul machen, in das Sie sie einfügen möchten, und darauf zugreifen oder ihr von anderen Modulen aus zuweisen. Es wäre besser, eine Funktion aufzurufen, um den Wert der Variablen festzulegen, oder sie zu einer Eigenschaft eines Singleton-Objekts zu machen. Auf diese Weise können Sie, wenn Sie Code ausführen müssen, wenn sich die Variable geändert hat, dies tun, ohne die externe Schnittstelle Ihres Moduls zu beschädigen.

Es ist normalerweise keine großartige Methode, Dinge zu tun – die Verwendung von Globals ist selten –, aber ich denke, dies ist die sauberste Methode, dies zu tun.

.

784400cookie-checkWie erstelle ich eine modulübergreifende Variable?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy