如何获取函数作用域内所有已定义变量的字典?
获取函数内部局部变量为字典的可靠方案
问题分析
你需要将函数内部定义的局部变量转换为字典,但原方案使用inspect.currentframe()存在两个核心问题:
- 栈帧可能被提前回收,
currentframe()可能返回None导致报错 - 获取的
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
相关产品推荐
相关产品推荐

