Mi sono imbattuto in un po 'di difficoltà nell'importazione di moduli in uno script Python. Farò del mio meglio per descrivere l'errore, perché mi imbatto in esso e perché sto legando questo particolare approccio per risolvere il mio problema (che descriverò tra un secondo):
Supponiamo di avere un modulo in cui ho definito alcune funzioni / classi di utilità, che si riferiscono a entità definite nello spazio dei nomi in cui verrà importato questo modulo ausiliario (sia "a" tale entità):
modulo 1:
def f():
print a
E poi ho il programma principale, dove è definito "a", in cui voglio importare quelle utilità:
import module1
a=3
module1.f()
L'esecuzione del programma attiverà il seguente errore:
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
Domande simili sono state poste in passato (due giorni fa, d'uh) e sono state suggerite diverse soluzioni, tuttavia non credo che queste soddisfino le mie esigenze. Ecco il mio contesto particolare:
Sto cercando di creare un programma Python che si connette a un server di database MySQL e visualizza / modifica i dati con una GUI. Per motivi di pulizia, ho definito il gruppo di funzioni ausiliarie / di utilità relative a MySQL in un file separato. Tuttavia hanno tutti una variabile comune, che avevo originariamente definita all'interno del modulo delle utilità, e che è l' oggetto cursore dal modulo MySQLdb. In seguito mi sono reso conto che l' oggetto cursore (che viene utilizzato per comunicare con il server db) dovrebbe essere definito nel modulo principale, in modo che sia il modulo principale che tutto ciò che viene importato in esso possano accedere a quell'oggetto.
Il risultato finale sarebbe qualcosa del genere:
utilities_module.py:
def utility_1(args):
code which references a variable named "cur"
def utility_n(args):
etcetera
E il mio modulo principale:
program.py:
import MySQLdb, Tkinter
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
E poi, non appena provo a chiamare una qualsiasi delle funzioni di utilità, si attiva il suddetto errore "nome globale non definito".
Un suggerimento particolare era di avere un'istruzione "from program import cur" nel file delle utilità, come questa:
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 *
Ma questa è importazione ciclica o qualcosa del genere e, in ultima analisi, si blocca anche. Quindi la mia domanda è:
Come diavolo posso rendere l'oggetto "cur", definito nel modulo principale, visibile a quelle funzioni ausiliarie che vengono importate in esso?
Grazie per il tuo tempo e le mie più sentite scuse se la soluzione è stata pubblicata altrove. Non riesco a trovare la risposta da solo e non ho più trucchi nel mio libro.
db
(e cur
, se insistete) in un modulo separato che sia program
e utilities_module
importarlo da. In questo modo non si ottengono dipendenze circolari (importando programmi da moduli che importano programmi) e la confusione che ne deriva.
fetch_all
scorrere su due elenchi invece , o semplicemente così puoi avere due diversi thread / greenlets / callback-chain / qualunque cosa usi il database senza conflitti).