Видимость глобальных переменных в импортируемых модулях
Мы столкнулись с небольшим количеством модулей для импорта в стену в скрипте Python. Я'Я сделаю все возможное, чтобы описать ошибку, почему я столкнулся с ней и почему ясвязывая этот конкретный подход для решения моей проблемы (которую я опишу через секунду):
Позволять'Предположим, у меня есть модуль, в котором ямы определили некоторые служебные функции / классы, которые ссылаются на сущности, определенные в пространстве имен, в которое будет импортирован этот вспомогательный модуль (пусть "a" быть таким лицом):
module1:
def f():
print a
И тогда у меня есть основная программа, где "а" определяется, в который я хочу импортировать эти утилиты:
import module1
a=3
module1.f()
Выполнение программы вызовет следующую ошибку:
Traceback (most recent call last):
File "Z:\Python\main.py", line 10, in
module1.f()
File "Z:\Python\module1.py", line 3, in f
print a
NameError: global name 'a' is not defined
Подобные вопросы были заданы в прошлом (два дня назадэ-э) и было предложено несколько решений, однако я нея не думаю, что они соответствуют моим требованиям.Вот'мой конкретный контекст: я
Я пытаюсь создать программу на Python, которая подключается к серверу базы данных MySQL и отображает / изменяет данные с помощью графического интерфейса. Ради чистоты яМы определили набор вспомогательных / утилитарных функций, связанных с MySQL, в отдельном файле. Однако все они имеют общую переменную, которую я изначально определилвнутри модуль утилит, и который являетсякурсор объект из модуля MySQLdb. Позже я понял, чтокурсор объект (который используется для связи с сервером БД) должен быть определен в основном модуле,так что и основной модуль, и все, что импортировано в него, могут получить доступ к этому объекту.
Конечный результат будет примерно таким:
utilities_module.py:
def utility_1(args):
code which references a variable named "cur"
def utility_n(args):
etcetera
И мой основной модуль:
program.py:
import MySQLdb, Tkinter
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
И затем, как только я пытаюсь вызвать любую из служебных функций, она вызывает вышеупомянутое "глобальное имя не определено ошибка.
Особое предложение было иметь "из программы import cur " оператор в файле утилит, такой как этот:
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 *
Но это's циклический импорт или что-то в этом роде, и, в итоге, он тоже вылетает. Итак, мой вопрос:
Как, черт возьми, я могу сделать "дворняжка» Объект, определенный в основном модуле, виден тем вспомогательным функциям, которые в него импортированы?
Спасибо за ваше время и мои глубокие извинения, если решение было опубликовано в другом месте. Я просто могуне могу найти ответ сам и яУ меня больше нет трюков в моей книге.