Видимость глобальных переменных в импортированных модуляхPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Видимость глобальных переменных в импортированных модулях

Сообщение Anonymous »

Я столкнулся с некоторой проблемой при импорте модулей в скрипт Python. Я постараюсь описать ошибку, почему я с ней столкнулся и почему я использую именно этот подход для решения своей проблемы (который я опишу через секунду):
Предположим, у меня есть модуль, в котором я определил некоторые служебные функции/классы, которые ссылаются на сущности, определенные в пространстве имен, в которое будет импортирован этот вспомогательный модуль (пусть "a" будет такой сущностью):
Модуль1:

Код: Выделить всё

def f():
print a
И затем у меня есть основная программа, где определено «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, в отдельном файле. Однако у всех них есть общая переменная, которую я изначально определил внутри модуля утилит и которая представляет собой объект cursor из модуля 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 *
А затем, как только я пытаюсь вызвать любую из служебных функций, возникает вышеупомянутая ошибка «глобальное имя не определено».
В частности, предлагалось добавить в файл утилит оператор from program import cur, например:
utilities_module.py:

Код: Выделить всё

from program import cur
#rest of function definitions
Но это циклический импорт или что-то в этом роде, и, в конечном итоге, он тоже дает сбой. Итак, мой вопрос:
Как, черт возьми, я могу сделать объект cur, определенный в основном модуле, видимым для тех вспомогательных функций, которые в него импортированы?

Подробнее здесь: https://stackoverflow.com/questions/159 ... ed-modules
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Основной вопрос PHP о глобальных переменных
    Гость » » в форуме Php
    0 Ответы
    29 Просмотры
    Последнее сообщение Гость
  • Понимание глобальных переменных C#
    Anonymous » » в форуме C#
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Понимание глобальных переменных C# [закрыто]
    Anonymous » » в форуме C#
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • Установка глобальных переменных во время выполнения для TestNG Suite?
    Anonymous » » в форуме JAVA
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Почему аннотация типа глобальных переменных отображается как Any?
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»