Python如何实现函数调用后自动在调用方函数内创建对应变量?
解决方案
方案1:直接调用自动注入变量(无需接收返回值)
通过inspect模块操作调用方的栈帧,直接将变量写入父函数的局部作用域,实现你要的调用后直接使用的效果:
import inspect def set_variables(): # 获取调用当前函数的父函数栈帧 caller_frame = inspect.currentframe().f_back # 所有需要注入的变量统一写在这里 inject_vars = { "var_a": 10, "var_b": 200, # 其余大量变量依次添加即可 } # 批量更新父函数局部变量 caller_frame.f_locals.update(inject_vars) # 删除栈帧引用避免内存泄漏 del caller_frame
使用效果和你期望的完全一致:
def parent_function(): set_variables() # 直接使用变量 print(var_a) # 输出10 print(var_b) # 输出200 parent_function()
方案2:接收字典后批量注入变量
如果你更倾向于先拿字典再注入,可实现如下的注入工具函数:
import inspect def some_func_to_auto_set_vars_from_dict(var_dict): caller_frame = inspect.currentframe().f_back # 生成批量赋值语句在父函数作用域执行 exec("\n".join([f"{k} = var_dict['{k}']" for k in var_dict]), caller_frame.f_globals, caller_frame.f_locals) del caller_frame # 你的set_variables改造为返回字典即可 def set_variables(): return { "var_a": 10, "var_b": 200, # 其余大量变量依次添加即可 }
使用示例:
def parent_function(): var_dict = set_variables() some_func_to_auto_set_vars_from_dict(var_dict) # 直接使用变量 print(var_a) # 输出10 print(var_b) # 输出200 parent_function()
更推荐的可维护性方案
上述两种动态注入的方法属于CPython特有的黑魔法,会降低代码可读性,IDE也无法做自动补全和类型校验。如果可接受通过属性访问变量,更推荐用数据类实现:
from dataclasses import dataclass @dataclass class RuntimeVars: var_a: int = 10 var_b: int = 200 # 其余大量变量依次添加即可 def parent_function(): vars = RuntimeVars() # 用属性方式访问 print(vars.var_a) # 输出10 print(vars.var_b) # 输出200
注意事项
- 动态注入方案仅在CPython解释器下有效,PyPy等其他解释器不支持该操作
- 注入变量会直接覆盖父函数内的同名变量,使用前请确认没有命名冲突
- 动态注入的变量没有类型提示,可配合编写
.pyi存根文件提升开发体验
内容的提问来源于stack exchange,提问作者user12314098
相关产品推荐
相关产品推荐

