Я столкнулся с небольшим портом, импортирующим модули в Python script. Я сделаю все возможное, чтобы описать ошибку, почему я столкнулся с ней, и почему я связываю этот конкретный подход для решения моей проблемы (которую я расскажу через секунду):
Предположим, что у меня есть модуль, в котором я определил некоторые служебные функции/классы, которые относятся к объектам, определенным в пространстве имен, в которые будет импортирован этот вспомогательный модуль (пусть "a" будет такой сущностью):
module1:
def f():
print a
И тогда у меня есть основная программа, где определен "a", в который я хочу импортировать эти утилиты:
import module1
a=3
module1.f()
Выполнение программы вызовет следующую ошибку:
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
В прошлом были заданы аналогичные вопросы (два дня назад, д'у), и было предложено несколько решений, однако я не думаю, что они подходят мои требования. Здесь мой конкретный контекст:
Я пытаюсь сделать программу Python, которая соединяется с сервером базы данных MySQL и отображает/изменяет данные с помощью графического интерфейса. Для чистоты я определил кучу вспомогательных/полезных функций, связанных с MySQL, в отдельном файле. Однако все они имеют общую переменную, которую я изначально определил внутри модуля утилит и который является объектом курсора из модуля MySQLdb. Позже я понял, что объект курсора (который используется для связи с сервером db) должен быть определен в основном модуле , так что и основной модуль, и все, что импортируется в него, могут получить доступ к этому объекту.
Конечный результат будет примерно таким:
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 *
И затем, как только я попытаюсь вызвать любую из функций утилит, он вызывает вышеупомянутую ошибку "global name not defined".
Особое предположение заключалось в том, что в файле утилит было указано выражение "из программы 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 *
Но этот циклический импорт или что-то в этом роде, и в нижней строке он тоже сбой. Поэтому мой вопрос:
Как я могу сделать объект "cur", определенный в основном модуле, видимым для тех вспомогательных функций, которые импортируются в него?
Спасибо за ваше время и мои самые глубокие извинения, если решение было опубликовано в другом месте. Я просто не могу найти ответ сам, и у меня больше нет трюков в моей книге.