La visibilité des variables globales dans les modules importés

J'ai couru dans un peu d'un mur à l'importation de modules dans un script Python. Je vais faire de mon mieux pour décrire l'erreur, pourquoi je rencontre, et pourquoi je suis attachant particulièrement à cette approche pour résoudre mon problème (que je vais décrire dans un deuxième):

Supposons que j'ai un module dans lequel j'ai défini une certaine utilité des fonctions/classes, qui se réfèrent à des entités définies dans l'espace de noms dans lequel cet auxiliaire module est importé (let "un" être une telle entité):

module1:

def f():
    print a

Et puis j'ai le programme principal, où "a" est défini, dans lequel je veux importer ces utilitaires:

import module1
a=3
module1.f()

De l'exécution du programme va déclencher l'erreur suivante:

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

Des questions similaires ont été posées dans le passé (il y a deux jours, d'uh) et plusieurs solutions ont été proposées, mais je ne pense pas vraiment que ces l'adapter à mes besoins. Voici mon contexte particulier:

Je suis en train de faire un programme en Python qui se connecte à MySQL est un serveur de base de données et affiche/modifie des données avec une interface graphique. Pour la propreté souci, j'ai défini la bande d'auxiliaires de l'utilitaire MySQL, les fonctions dans un fichier séparé. Pourtant, elles ont toutes une variable commune, qui m'avait été défini à l'origine à l'intérieur de le module utilitaires, et qui est le curseur l'objet à partir du module MySQLdb.
Plus tard, j'ai réalisé que la curseur objet (qui est utilisé pour communiquer avec le serveur de base de données) doivent être définis dans le module principal, de sorte que le module principal et de tout ce qui est importé, il peut accéder à cet objet.

Résultat final serait quelque chose comme ceci:

utilities_module.py:

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

Et mon module principal:

program.py:

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

Et puis, dès que j'essaie d'appeler une des fonctions utilitaires, il déclenche le fameux "nom global non définie" erreur.

Une suggestion particulière était d'avoir un "à partir du programme d'importation cur" instruction dans les services de fichier, comme ceci:

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 *

Mais c'est cyclique d'importation ou quelque chose comme ça et, en bout de ligne, il se bloque trop. Donc ma question est:

Comment diable puis-je faire le "cur" de l'objet, défini dans le module principal, visible à ceux des fonctions auxiliaires qui sont importés en elle?

Merci pour votre temps et mes plus sincères excuses si la solution a été posté ailleurs. Je ne peux pas trouver la réponse moi-même et je n'ai pas plus d'un tour dans mon livre.

  • En fonction de votre mise à jour: Vous ne voulez probablement pas une seule et même curseur de toute façon. Une seule connexion partagée, oui, mais les curseurs ne sont pas chers, et il y a souvent de bonnes raisons d'avoir plusieurs curseurs vivant à la même époque (par exemple, de sorte que vous pouvez parcourir par le biais de deux d'entre eux en prison au lieu d'avoir à fetch_all et itérer sur les deux listes à la place, ou tout simplement de sorte que vous pouvez avoir deux threads/greenlets/rappel-chaînes/quelle que soit l'aide de la base de données sans conflits).
  • De toute façon, tout ce que vous souhaitez partager, je pense que la réponse ici est de déplacer db (et cur, si vous insistez) dans un module distinct que les deux program et utilities_module importer à partir de. De cette façon, vous n'obtenez pas de dépendances circulaires (programme d'importation de modules de programme d'importations) et de la confusion qui vient avec eux.
InformationsquelleAutor Nubarke | 2013-04-11