Sichtbarkeit von globalen Variablen, die in importierten Modulen

Ich habe in ein bisschen ein Wand-Module zu importieren, die in einem Python-Skript. Ich werde mein bestes tun, um zu beschreiben, den Fehler, warum ich, und warum bin ich das binden dieser bestimmten Ansatz um mein problem zu lösen (was ich beschreiben werde, in einer Sekunde):

Nehmen wir an, ich habe ein Modul, in dem ich definiert habe einige utility-Funktionen/Klassen, die sich auf Entitäten definiert den namespace, in die das Hilfs-Modul importiert werden (lassen wir "eine" solche Person):

module1:

def f():
    print a

Und dann habe ich das main-Programm, wo "a" ist definiert, in welche ich importieren möchten diese utilities:

import module1
a=3
module1.f()

Ausführung des Programms löst die folgende Fehlermeldung:

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 gestellt zu haben in der Vergangenheit (vor zwei Tagen, d'uh) und mehrere Lösungen wurden vorgeschlagen, jedoch glaube ich nicht wirklich, dass diese passen meine Anforderungen. Hier mein Kontext:

Ich versuche zu machen, ein Python-Programm, das eine Verbindung zu einer MySQL-Datenbank-server und zeigt/ändert die Daten mit einem GUI. Der Sauberkeit halber habe ich definiert, das Bündel von Hilfs - /utility-MySQL-Funktionen in einer separaten Datei. Aber Sie alle haben eine gemeinsame variable, die ich hatte ursprünglich definiert innen dem utilities-Modul, und das ist der cursor Objekt aus MySQLdb-Modul.
Später habe ich realisiert, dass die cursor Objekt (die verwendet wird, um die Kommunikation mit dem db-server) definiert werden sollte, in der Haupt-Modul, , so dass sowohl die Haupt-Modul und alles, was importiert wird, in Sie kann auf dieses Objekt zugegriffen wird.

Ergebnis wäre so etwas wie dieses:

utilities_module.py:

def utility_1(args):
    code which references a variable named "cur"
def utility_n(args):
    etcetera

Und mein main-Modul:

program.py:

import MySQLdb, Tkinter
db=MySQLdb.connect(#blahblah) ; cur=db.cursor()  #cur is defined!
from utilities_module import *

Und dann, sobald ich versuche zu rufen jedes der Programme Funktionen, löst die oben genannten "global name nicht definiert" - Fehler.

Einen bestimmten Vorschlag war, ein "aus dem Programm-import cur" - Anweisung in die utilities-Datei, wie diese:

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, dass der zyklische import oder sowas und, unterm Strich, es stürzt auch. Also meine Frage ist:

Wie in der Hölle kann ich das "cur" - Objekt, definiert in der main-Modul, sichtbar für diejenigen, die Hilfs-Funktionen, die importiert es?

Vielen Dank für Ihre Zeit und meine tiefsten Entschuldigungen, wenn die Lösung schon gepostet hat an anderer Stelle. Ich kann einfach nicht die Antwort finden, die mich und ich habe keine mehr tricks in meinem Buch.

  • Basierend auf Ihren update: Sie wollen wahrscheinlich nicht einen einzigen shared cursor sowieso. Eine einzige, gemeinsam genutzte Verbindung, ja, aber Cursor sind Billig, und es gibt oft gute Gründe zu haben, die mehrere Cursor lebendig zur gleichen Zeit (z.B., so dass Sie Durchlaufen können zwei von Ihnen im Gleichschritt anstatt fetch_all und Durchlaufen zwei Listen statt, oder einfach nur so können Sie zwei verschiedene threads/greenlets/callback-Ketten/was auch immer mit der Datenbank ohne Konflikte).
  • Sowieso, was Sie wollen zu teilen, ich denke, die Antwort ist hier zu bewegen db (und cur, wenn Sie darauf bestehen) in ein separates Modul, dass sowohl program und utilities_module importieren aus. So dass Sie nicht bekommen, zirkuläre Abhängigkeiten (Import-Programm aus Modulen, die Programm-Importe) und die Verwirrung, die kommt mit.
InformationsquelleAutor Nubarke | 2013-04-11
Schreibe einen Kommentar