Python中如何从配置文件创建类/实例变量?
解决方案
一、自动创建类/实例变量
你可以通过指定exec()的作用域字典,把配置里的变量批量提取出来,直接绑定到实例或类上,不用手动逐个赋值。
1. 绑定为实例变量(推荐)
在类的__init__方法里,用临时字典承接exec执行后的变量,再把字典内容更新到实例的属性字典self.__dict__中:
class ConfigReader: def __init__(self, config_path): config_vars = {} with open(config_path) as f: # 把配置变量存到config_vars字典里 exec(f.read(), globals(), config_vars) # 批量转为实例属性 self.__dict__.update(config_vars) # 使用示例 fr = ConfigReader(r'C:\Users\username\proj\config.ini') print(fr.env) # 输出 'test' print(fr.target_database) # 输出 'snowflake' print(fr.seed_query) # 输出 "some select query"
2. 绑定为类变量
如果想让所有实例共享配置,可以把变量绑定到类上:
class ConfigReader: @classmethod def load_class_config(cls, config_path): config_vars = {} with open(config_path) as f: exec(f.read(), globals(), config_vars) # 批量更新类属性 cls.__dict__.update(config_vars) # 先加载类配置 ConfigReader.load_class_config(r'C:\Users\username\proj\config.ini') # 所有实例都能访问这些类变量 fr1 = ConfigReader() fr2 = ConfigReader() print(fr1.env == fr2.env) # 输出 True
二、将配置变量放到__init__.py中作为全局变量
完全可以,在你的包的__init__.py里执行读取配置的代码,把变量直接定义在模块级别,整个包内的模块都能直接导入使用:
在your_package/__init__.py中:
# __init__.py config_vars = {} with open(r'C:\Users\username\proj\config.ini') as f: exec(f.read(), globals(), config_vars) # 把配置变量导入到模块全局作用域 globals().update(config_vars)
然后在包内的其他模块中直接导入:
# 包内其他文件 from your_package import env, target_database, con_info
注意事项
- 你的
config.ini本质是Python代码片段,不是标准INI格式,用exec可行,但要确保配置文件安全,不要加载不可信的文件。 - 如果想改用标准INI格式,可使用Python内置的
configparser模块,但需要调整配置文件为分组键值对的格式。
内容的提问来源于stack exchange,提问作者shankar
相关产品推荐
相关产品推荐

