如何获取Python lambda表达式中绑定的外部变量的实际值而非源码
解决方案
inspect.getsource只会返回函数的静态源码文本,不会解析运行时的变量绑定值,lambda引用的外部变量实际值可以通过函数对象的内置属性直接获取,分两种场景处理:
场景1:index、val是全局作用域变量
如果你的示例代码直接定义在全局作用域,变量存储在函数的__globals__字典中,直接取值即可:
index = 1 val = 0 f = lambda a: a[index] == val # 直接获取全局变量值 print(f.__globals__['index']) # 输出1 print(f.__globals__['val']) # 输出0
场景2:index、val是闭包作用域的自由变量
如果lambda定义在某个函数内部形成闭包(变量属于外部函数的局部变量),变量值存储在__closure__属性的cell对象中,配合__code__.co_freevars可以获取变量名和对应绑定值:
def create_lambda(): index = 1 val = 0 return lambda a: a[index] == val f = create_lambda() # 获取所有自由变量名称 free_var_names = f.__code__.co_freevars # 遍历匹配变量名和绑定值 for name, cell in zip(free_var_names, f.__closure__): print(f"{name} = {cell.cell_contents}") ''' 输出结果: index = 1 val = 0 '''
通用查询方法
你可以用下面的代码一次性打印lambda中所有外部引用变量的实际值,自动适配全局和闭包场景:
def get_lambda_bound_values(func): bound_vals = {} # 先处理闭包自由变量 if func.__closure__: free_vars = func.__code__.co_freevars for name, cell in zip(free_vars, func.__closure__): bound_vals[name] = cell.cell_contents # 处理全局变量 for name in func.__code__.co_names: if name in func.__globals__: bound_vals[name] = func.__globals__[name] return bound_vals # 调用示例 print(get_lambda_bound_values(f)) # 输出 {'index':1, 'val':0}
内容的提问来源于stack exchange,提问作者user2421555
相关产品推荐
相关产品推荐

