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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:06:02