Visibilidade de variáveis globais em módulos importados
Eu me deparei com um pouco de parede importando módulos em um script Python. Eu farei o meu melhor para descrever o erro, por que eu me deparo com ele e por que estou ligando essa abordagem específica para resolver o meu problema (que descreverei em um segundo):
Vamos supor que eu tenha um módulo no qual eu tenha definido algumas funções / classes de utilidade, que se referem a entidades definidas no namespace no qual este módulo auxiliar será importado (deixe "a" ser tal entidade):
Módulo 1:
def f():
print a
E então eu tenho o programa principal, onde "a" é definido, para o qual eu quero importar esses utilitários:
import module1
a=3
module1.f()
A execução do programa acionará o seguinte erro:
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
Perguntas semelhantes foram feitas no passado (dois dias atrás, d'uh) e várias soluções foram sugeridas, no entanto, eu não acho que elas se encaixem em minhas exigências.Aqui está meu contexto particular:
Eu estou tentando fazer um programa de Python que se conecta a um servidor de banco de dados MySQL e exibe / modifica dados com uma GUI. Por questões de limpeza, eu defini o grupo de funções auxiliares / relacionadas ao MySQL em um arquivo separado. No entanto, todos eles têm uma variável comum, que eu tinha definido originalmentedentro o módulo de utilidades, e qual é ocursor objeto do módulo MySQLdb. Mais tarde percebi que ocursor objeto (que é usado para se comunicar com o servidor db) deve ser definido no módulo principal,de modo que o módulo principal e qualquer coisa importada para ele possam acessar esse objeto.
O resultado final seria algo assim:
utilities_module.py:
def utility_1(args):
code which references a variable named "cur"
def utility_n(args):
etcetera
E meu módulo principal:
program.py:
import MySQLdb, Tkinter
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
E então, assim que eu tento chamar qualquer uma das funções de utilitários, ele aciona o erro "nome global não definido" acima mencionado.
Uma sugestão específica era ter uma instrução "from program import cur" no arquivo de utilitários, como:
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 *
Mas isso é uma importação cíclica ou algo assim e, em última análise, ele também falha. Então minha pergunta é:
Como posso fazer o objeto "cur", definido no módulo principal, visível para as funções auxiliares que são importadas para ele?
Obrigado pelo seu tempo e minhas mais profundas desculpas se a solução foi publicada em outro lugar. Eu simplesmente não consigo encontrar a resposta e não tenho mais truques no meu livro.