Проблемы с созданием класса конфигурации для всего приложения

#python

#питон

Вопрос:

Я создал два модуля python, чтобы продемонстрировать общую проблему, с которой я, похоже, сталкиваюсь при разработке приложений на python.

test_config.py

 import do_something  class TestConfig:   _conf = {    "test_case": 'Goodbye',  }    @staticmethod  def get_config(name):  return TestConfig._conf[name]   @staticmethod  def set(name, value):  TestConfig._conf[name] = value  if __name__ == "__main__":   print(TestConfig.get_config('test_case')) # prints Goodbye  TestConfig.set('test_case', 'Hello')   print(TestConfig.get_config('test_case')) # Prints Hello  do_something.say_something() # prints Goodbye?   # Why does do_something print Goodbye- expected Hello  

do_something.py

 from test_config import TestConfig  def say_something():   text = TestConfig.get_config('test_case')  print(text)  

Может кто-нибудь объяснить, почему do_something.say_something() выводит «До свидания», а не «Привет»? И, возможно, лучший способ создать глобальный класс конфигурации для доступа к глобальным переменным. Я продолжаю сталкиваться с подобными проблемами, а также с циклическим импортом. Мне нужно установить некоторые переменные конфигурации во время выполнения.

Ответ №1:

Давайте поставим эту единственную строчку:

 print(id(TestConfig))  

подобный этому:

 import do_something   class TestConfig:  _conf = {   "test_case": 'Goodbye',  }   @staticmethod  def get_config(name):  return TestConfig._conf[name]   @staticmethod  def set(name, value):  TestConfig._conf[name] = value   print(id(TestConfig))   if __name__ == "__main__":  print(TestConfig.get_config('test_case')) # prints Goodbye  TestConfig.set('test_case', 'Hello')  print(TestConfig.get_config('test_case')) # Prints Hello  do_something.say_something() # prints Goodbye?  

и это

 from test_config import TestConfig  print(id(TestConfig))   def say_something():   text = TestConfig.get_config('test_case')  print(text)  

Мы поместили только 2 строки, так что он должен распечатать 2 одинаковых идентификатора, верно?

 1700517329968 1700517329968 1700517331888 Goodbye Hello Goodbye  

На самом деле он вызывается 3 раза, и 3-й на самом деле имеет другой идентификатор! Так что все по-другому TestConfig .

Логика-это:

Основной сценарий(test_config.py) импорт do_something.py do_something.py импортирует test_config.py как модуль! ( if __name__ == "__main__": теперь значение false, чтобы этот блок не запускался)

Честно говоря, я не на 100% уверен, что это не считается циклическим импортом, но, возможно, импорт в test_config.py не импортировался do_something снова, потому что он уже импортирован в пространство имен или имеет некоторую логику разрешения циклического импорта.

Предлагаемое исправление заключается в наличии отдельного сценария python конфигурации или любого формата данных json/yaml. Такой круговой импорт не является хорошим решением!