可通过__closure__和__code__.co_freevars直接读取闭包信息:若__closure__为none则非闭包;否则co_freevars元组与__closure__中cell对象一一对应,可获取变量名及通过cell.cell_contents获取当前值。

可以通过函数对象的内置属性直接读取闭包信息,无需额外工具或运行时解析代码。关键在于两个属性配合使用:__closure__ 和 __code__.co_freevars。
确认是否为闭包
先检查函数是否有闭包结构:
- 若 f.__closure__ 为 None,说明不是闭包,不捕获任何外部变量
- 若 f.__closure__ 是非空元组(如
(<cell at int object>,)</cell>),则存在闭包
提取被捕获的变量名
变量名不存于 __closure__ 中,而由函数字节码记录:
-
f.__code__.co_freevars 返回一个元组,例如
('x', 'config') - 这个元组与 __closure__ 中 cell 对象一一对应,顺序一致
- 因此可直接用
list(f.__code__.co_freevars)得到所有自由变量名
获取变量当前值(可选)
如果还需知道这些变量此刻的实际值,可遍历 __closure__:
- 对每个 cell 对象,访问 cell.cell_contents 即得引用的对象值
- 注意:若变量已被销毁(如外层函数彻底退出且无其他引用),访问会触发 ValueError
- 安全做法是加 try/except 包裹,或仅在调试/开发阶段使用
封装成自动化分析函数
以下是一个轻量实用的分析器:
def inspect_closure(func):
if not hasattr(func, '__closure__') or func.__closure__ is None:
return []
free_vars = func.__code__.co_freevars
return list(free_vars)
调用 inspect_closure(my_closure) 即返回字符串列表,如 ['base_url', 'timeout'] —— 完全基于运行时对象内省,稳定可靠。










