Совместное использование глобальной переменной в модулях python

#python

#python

Вопрос:

Я пытаюсь создать глобальную переменную между двумя файлами, это фрагмент соответствующего кода:

Logger.py

 import globals
class Logger():
...
  def log(self): 
    globals.sql.execute('..')
  

globals.py

 import Logger
import SQL

logger=Logger.Logger()
sql=SQL.SQL()
  

При запуске я получаю сообщение об ошибке

Ошибка атрибута: объект ‘module’ не имеет атрибута ‘sql’

на globals.sql.execute('..')

Ответ №1:

У вас есть циклический импорт, Logger imports globals который импортирует Logger . Далее Logger.Logger() строка выполняется перед sql=SQL.SQL() строкой, поэтому последняя еще не существует.

В остальном ваш код неполон, но если вы попытаетесь зарегистрировать что-либо из Logger.__init__() метода, это означает, что globals модуль еще не завершен, и вы получите ошибку атрибута.

Возможно, вы могли бы исправить это, переместив sql = SQL.SQL() строку в run перед созданием Logger() экземпляра. Однако рассмотрите возможность полного отказа от циклического импорта.

Вы могли бы передать sql объект в регистратор, чтобы избежать необходимости создавать циклический импорт, например.

Комментарии:

1. Можете ли вы предложить способ избежать циклического импорта в этом примере?

2. @Kikapi: добавлено; не используйте sql в качестве глобальной, передайте ее в качестве аргумента регистратору.