#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. Такой круговой импорт не является хорошим решением!