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

Python包模块间共享变量有什么更优方案?需保留setup.py入口点特性

问题核心原因

你当前代码报错的核心原因有两个:

  1. 你将content的f-string插值逻辑写在了tex.py的模块顶层,模块被导入时这段代码会立刻执行,此时application.py中main函数内的a、b还未完成赋值,自然找不到变量。
  2. Python不同模块的变量作用域是隔离的,tex.py默认无法直接访问application.py中main函数的局部变量。
推荐解决方案

两种方案都不会影响你在setup.py中配置的入口点特性,不需要修改原有入口逻辑。

方案1:显式传参(最规范,无耦合)

直接把需要的变量作为参数传入generate函数,变量数量多的话可以打包成字典、dataclass实例传递,不需要修改全局作用域,也不会产生模块间的反向依赖。
修改后的代码示例:

# application.py
def main():
    a = 123
    b = 456
    # 变量少可以直接逐参数传递,变量多的话打包成字典统一传递
    context = {
        "a": a,
        "b": b,
        # 其余需要传递的变量直接加在这里即可
    }
    from tex import generate
    generate(context)
# tex.py
def generate(context):
    # content逻辑移到函数内部,调用生成时再做插值
    content = f'{context["a"]} is not equal to {context["b"]}'
    with open('report.tex','w') as f:
        f.write(content)

如果不想手动写字典取值,也可以把参数定义为**kwargs,调用时用generate(a=a, b=b)传入,函数内直接用变量名取值即可。

方案2:全局配置容器(适合多模块共享变量)

如果有多个模块都需要用到这些变量,可以单独定义一个全局配置模块存储共享状态,避免逐层传参的麻烦:

# 新增config.py配置文件
context = {}
# application.py
import config
def main():
    config.context["a"] = 123
    config.context["b"] = 456
    from tex import generate
    generate()
# tex.py
import config
def generate():
    context = config.context
    content = f'{context["a"]} is not equal to {context["b"]}'
    with open('report.tex','w') as f:
        f.write(content)

内容的提问来源于stack exchange,提问作者Tylerastro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:30:00