Eu me deparei com uma espécie de parede importando módulos em um script Python. Farei o meu melhor para descrever o erro, por que o encontrei e por que estou vinculando essa abordagem específica para resolver meu problema (que descreverei em um segundo):
Vamos supor que eu tenha um módulo no qual defini algumas funções / classes de utilitários, que se referem a entidades definidas no namespace para o qual esse módulo auxiliar será importado (seja "a" essa entidade):
Módulo 1:
def f():
print a
E então eu tenho o programa principal, onde "a" é definido, para o qual desejo importar esses utilitários:
import module1
a=3
module1.f()
Executar o programa irá desencadear 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 realmente não acho que elas atendam aos meus requisitos. Este é meu contexto particular:
Estou tentando fazer um programa Python que se conecta a um servidor de banco de dados MySQL e exibe / modifica dados com uma GUI. Para fins de limpeza, defini o grupo de funções auxiliares / utilitárias relacionadas ao MySQL em um arquivo separado. No entanto, todos eles têm uma variável comum, que eu defini originalmente dentro do módulo de utilitários, e que é o objeto cursor do módulo MySQLdb. Mais tarde, percebi que o objeto cursor (que é usado para se comunicar com o servidor db) deve ser definido no módulo principal, de forma que tanto o módulo principal quanto qualquer coisa importada para ele possam acessar esse objeto.
O resultado final seria algo como este:
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 tento chamar qualquer uma das funções de utilitários, ele aciona o erro "nome global não definido" mencionado anteriormente.
Uma sugestão particular era ter uma instrução "from program import cur" no arquivo de utilitários, como este:
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 é importação cíclica ou algo parecido e, no final das contas, também trava. Então, minha pergunta é:
Como diabos posso tornar 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 sinceras desculpas se a solução foi postada em outro lugar. Simplesmente não consigo encontrar a resposta sozinho e não tenho mais truques em meu livro.
db
(e cur
, se você insistir) em um módulo separado que tanto program
e utilities_module
importá-lo a partir. Dessa forma, você não obtém dependências circulares (importar programa de módulos que o programa importa) e a confusão que vem com eles.
fetch_all
iterar por meio de duas listas em vez disso , ou apenas para que você possa ter dois threads / greenlets / callback-chains / qualquer outro usando o banco de dados sem conflitos).