如何让Python公共子模块获取项目级全局变量且无需硬编码项目信息
解决方案
核心思路为common子模块提供统一的全局配置初始化入口,主脚本仅需在启动时调用一次初始化接口传入项目信息,common内部所有函数均可直接读取存储的全局配置,无需硬编码项目信息也无需逐函数传参。
1. 调整common子模块代码
首先在common目录下新增config.py文件,用于存储全局配置和提供初始化方法:
# common/config.py from typing import Optional # 初始占位符 PROJECT_NAME: Optional[str] = None PROJECT_VERSION: Optional[str] = None def init_config(project_name: str, project_version: str) -> None: global PROJECT_NAME, PROJECT_VERSION if not project_name or not project_version: raise ValueError("项目名称和版本不能为空") PROJECT_NAME = project_name PROJECT_VERSION = project_version
修改common/functions.py,从内部配置模块读取项目信息:
# common/functions.py import os import winreg from .config import PROJECT_NAME def getAppDataFolder(): if not PROJECT_NAME: raise RuntimeError("请先调用common.config.init_config完成项目配置初始化") return os.path.join(winreg.ExpandEnvironmentStrings("%appdata%"), PROJECT_NAME)
2. 主脚本仅需一次初始化
各项目主脚本仅需在导入common业务模块前完成一次配置初始化即可,无需修改其他逻辑:
# project1.py PROJECT_NAME = "Project 1" PROJECT_VERSION = "1.00" # 先初始化配置 from common.config import init_config init_config(PROJECT_NAME, PROJECT_VERSION) # 后续正常导入使用common的所有功能 from common import functions
# project2.py PROJECT_NAME = "Project 2" PROJECT_VERSION = "1.01" from common.config import init_config init_config(PROJECT_NAME, PROJECT_VERSION) # 后续业务逻辑
方案优势
- 满足约束:项目名称、版本仅在各项目主脚本声明一次,无冗余代码
- common模块完全无项目硬编码,新增分支项目无需修改common代码
- 规避了原
from __main__ import方案的潜在问题:当common函数被其他子模块间接调用时,不会出现__main__模块不符合预期导致的导入错误 - 内置校验逻辑,未初始化直接调用会抛出明确报错,便于问题定位
- 扩展性强,后续新增全局公共配置仅需扩展
config.py字段即可
内容的提问来源于stack exchange,提问作者Megan Caithlyn
相关产品推荐
相关产品推荐

