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

如何获取函数作用域内所有已定义变量的字典?

获取函数内部局部变量为字典的可靠方案

问题分析

你需要将函数内部定义的局部变量转换为字典,但原方案使用inspect.currentframe()存在两个核心问题:

  1. 栈帧可能被提前回收,currentframe()可能返回None导致报错
  2. 获取的f_locals可能包含无关内容,且在函数外部调用时无法准确获取目标函数的局部变量

可靠实现方案

方案1:函数内部主动收集变量

直接在函数内部通过locals()获取当前局部变量,过滤特殊变量后赋值给函数属性,确保只获取你定义的变量:

from typing import Any

def myfunc():
    var1 = 10
    var2 = 20
    var3 = 30
    var4 = '40'
    var5 = False
    # 过滤以__开头的特殊变量,仅保留用户自定义变量
    local_vars = {k: v for k, v in locals().items() if not k.startswith('__')}
    myfunc.vars = local_vars

# 必须先执行函数,变量才会被初始化并完成收集
myfunc()
x: dict[str, Any] = myfunc.vars
print(x)
# 输出: {'var1': 10, 'var2': 20, 'var3': 30, 'var4': '40', 'var5': False}

方案2:装饰器批量处理(多函数场景)

如果需要给多个函数添加变量收集功能,可以用装饰器封装重复逻辑:

from typing import Any, Callable

def capture_func_vars(func: Callable) -> Callable:
    def wrapped(*args, **kwargs):
        # 执行原函数并获取返回的局部变量
        local_vars = func(*args, **kwargs)
        # 过滤特殊变量后存储到函数属性
        func.vars = {k: v for k, v in local_vars.items() if not k.startswith('__')}
        return local_vars
    return wrapped

@capture_func_vars
def myfunc():
    var1 = 10
    var2 = 20
    var3 = 30
    var4 = '40'
    var5 = False
    return locals()

myfunc()
x: dict[str, Any] = myfunc.vars
print(x)

关键说明

  • 函数内部变量仅在函数执行时初始化,因此必须先调用函数才能获取到变量字典
  • 直接在函数内部使用locals()获取变量,能避免栈帧回收的不确定性,且可通过字典推导式精准过滤无关内容
  • 避免在函数外部依赖inspect模块的栈帧操作,因为栈帧生命周期由Python解释器管理,不可靠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 06:26:25