You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 04:42:03