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.

questionAnswers(7)

yourAnswerToTheQuestion