- 设计思路:
- 使用
configparser
模块来读取配置文件,它是Python标准库中用于解析配置文件的工具。
- 为了避免循环依赖,采用“延迟加载”的策略。即模块在真正使用常量时才加载配置,而不是在模块导入时就加载。同时,将配置的加载逻辑封装在一个独立的函数中,这样可以确保配置只被加载一次。
- 代码示例:
[constants]
VALUE1 = 10
VALUE2 = 20
- 创建一个
config_loader.py
文件来加载配置:
import configparser
_config = None
def load_config():
global _config
if _config is None:
_config = configparser.ConfigParser()
_config.read('config.ini')
return _config
def get_constant(constant_name):
config = load_config()
return config.get('constants', constant_name)
from config_loader import get_constant
def use_value1():
value1 = get_constant('VALUE1')
print(f"Using VALUE1: {value1}")
- 假设
module2.py
也依赖配置常量,并且可能与module1.py
存在潜在循环依赖:
from config_loader import get_constant
def use_value2():
value2 = get_constant('VALUE2')
print(f"Using VALUE2: {value2}")
from module1 import use_value1
from module2 import use_value2
if __name__ == "__main__":
use_value1()
use_value2()
- 解释:
- 在
config_loader.py
中,load_config
函数负责加载配置文件,并且使用全局变量_config
来确保配置只被加载一次。get_constant
函数用于获取具体的常量值,它调用load_config
函数来确保配置已加载。
- 在
module1.py
和module2.py
中,通过from config_loader import get_constant
导入获取常量的函数。这样,模块在调用use_value1
或use_value2
函数时才会加载配置,避免了模块导入时就加载配置可能产生的循环依赖问题。
- 在
main.py
中,可以看到如何使用这些模块。由于配置的加载是延迟的,即使module1.py
和module2.py
之间存在潜在的循环依赖,也不会导致加载错误。