Ich bin auf eine Art Wand gestoßen, die Module in einem Python-Skript importiert. Ich werde mein Bestes tun, um den Fehler zu beschreiben, warum ich darauf stoße und warum ich diesen speziellen Ansatz zur Lösung meines Problems binde (den ich gleich beschreiben werde):
Angenommen, ich habe ein Modul, in dem ich einige Dienstprogrammfunktionen / -klassen definiert habe, die sich auf Entitäten beziehen, die im Namespace definiert sind, in den dieses Hilfsmodul importiert wird (sei "a" eine solche Entität):
Modul 1:
def f():
print a
Und dann habe ich das Hauptprogramm, in dem "a" definiert ist, in das ich diese Dienstprogramme importieren möchte:
import module1
a=3
module1.f()
Das Ausführen des Programms löst den folgenden Fehler aus:
Traceback (most recent call last):
File "Z:\Python\main.py", line 10, in <module>
module1.f()
File "Z:\Python\module1.py", line 3, in f
print a
NameError: global name 'a' is not defined
Ähnliche Fragen wurden in der Vergangenheit gestellt (vor zwei Tagen, d'uh) und es wurden verschiedene Lösungen vorgeschlagen, aber ich denke nicht, dass diese meinen Anforderungen entsprechen. Hier ist mein besonderer Kontext:
Ich versuche ein Python-Programm zu erstellen, das eine Verbindung zu einem MySQL-Datenbankserver herstellt und Daten über eine GUI anzeigt / ändert. Aus Gründen der Sauberkeit habe ich die Reihe der MySQL-bezogenen Hilfs- / Dienstprogrammfunktionen in einer separaten Datei definiert. Jedoch haben sie alle eine gemeinsame Variable, die ich ursprünglich definiert war innerhalb des Versorgungsmoduls und die der Cursor - Objekt aus MySQLdb Modul. Später wurde mir klar, dass das Cursorobjekt (das zur Kommunikation mit dem Datenbankserver verwendet wird) im Hauptmodul definiert werden sollte, damit sowohl das Hauptmodul als auch alles, was in das Modul importiert wird, auf dieses Objekt zugreifen können.
Das Endergebnis wäre ungefähr so:
utilities_module.py:
def utility_1(args):
code which references a variable named "cur"
def utility_n(args):
etcetera
Und mein Hauptmodul:
program.py:
import MySQLdb, Tkinter
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
Sobald ich versuche, eine der Dienstprogrammfunktionen aufzurufen, wird der oben genannte Fehler "Globaler Name nicht definiert" ausgelöst.
Ein besonderer Vorschlag war, eine Anweisung "from program import cur" in die Dienstprogrammdatei aufzunehmen, wie folgt:
utilities_module.py:
from program import cur
#rest of function definitions
program.py:
import Tkinter, MySQLdb
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
Aber das ist zyklischer Import oder so ähnlich und unter dem Strich stürzt es auch ab. Meine Frage lautet also:
Wie zum Teufel kann ich das im Hauptmodul definierte "cur" -Objekt für die darin importierten Hilfsfunktionen sichtbar machen?
Vielen Dank für Ihre Zeit und meine tiefste Entschuldigung, wenn die Lösung an anderer Stelle veröffentlicht wurde. Ich kann die Antwort einfach nicht selbst finden und habe keine Tricks mehr in meinem Buch.
db
(und cur
, wenn Sie darauf bestehen), das beides program
und es utilities_module
importiert. Auf diese Weise erhalten Sie keine zirkulären Abhängigkeiten (Importieren von Programmen aus Modulen, die vom Programm importiert werden) und die damit verbundene Verwirrung.
fetch_all
Gleichschritt durchlaufen, anstatt stattdessen zwei Listen durchlaufen zu müssen oder nur so können Sie zwei verschiedene Threads / Greenlets / Callback-Ketten / was auch immer verwenden, die die Datenbank ohne Konflikte verwenden).