Widoczność zmiennych globalnych w importowanych modułach
Wpadłem na trochę ściany importując moduły w skrypcie Pythona. Zrobię, co w mojej mocy, aby opisać błąd, dlaczego się na niego natknąłem i dlaczego wiążę to szczególne podejście do rozwiązania mojego problemu (który opiszę za chwilę):
Przypuśćmy, że mam moduł, w którym zdefiniowałem niektóre funkcje / klasy narzędzi, które odnoszą się do jednostek zdefiniowanych w przestrzeni nazw, do której ten moduł pomocniczy zostanie zaimportowany (niech „będzie taką jednostką”):
moduł 1:
def f():
print a
A potem mam program główny, w którym zdefiniowano „a”, do którego chcę zaimportować te narzędzia:
import module1
a=3
module1.f()
Wykonanie programu spowoduje następujący błąd:
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
Podobne pytania zostały zadane w przeszłości (dwa dni temu, d'uh) i kilka rozwiązań zostało zasugerowanych, ale tak naprawdę nie sądzę, że pasują one do moich wymagań.Oto mój szczególny kontekst:
Próbuję stworzyć program Pythona, który łączy się z serwerem bazy danych MySQL i wyświetla / modyfikuje dane za pomocą GUI. Ze względu na czystość zdefiniowałem kilka dodatkowych funkcji związanych z MySQL-em w oddzielnym pliku. Wszystkie mają jednak wspólną zmienną, którą pierwotnie zdefiniowałemwewnątrz moduł narzędzi, a którykursor obiekt z modułu MySQLdb. Później zdałem sobie sprawę, żekursor obiekt (używany do komunikacji z serwerem db) powinien być zdefiniowany w module głównym,aby zarówno moduł główny, jak i wszystko, co jest do niego importowane, mogły uzyskać dostęp do tego obiektu.
Rezultatem końcowym byłoby coś takiego:
utilities_module.py:
def utility_1(args):
code which references a variable named "cur"
def utility_n(args):
etcetera
A mój główny moduł:
program.py:
import MySQLdb, Tkinter
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
A potem, gdy próbuję wywołać dowolną z funkcji narzędziowych, wyzwala wspomniany błąd „globalna nazwa niezdefiniowana”.
Szczególną sugestią było posiadanie instrukcji „z importu programu” w pliku narzędzi, takim jak ten:
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 *
Ale to jest cykliczny import lub coś w tym stylu, a co najważniejsze, to też się załamuje. Więc moje pytanie brzmi:
Jak, u diabła, mogę uczynić obiekt „cur”, zdefiniowany w głównym module, widocznym dla tych funkcji pomocniczych, które są do niego importowane?
Dziękuję za poświęcony czas i moje najgłębsze przeprosiny, jeśli rozwiązanie zostało opublikowane w innym miejscu. Po prostu nie mogę znaleźć odpowiedzi i nie mam więcej sztuczek w mojej książce.