比较 Python 中的闭包
python 222
原文标题 :Comparing closures in Python
我的目标是比较两个有界闭包并检查它们是否与相同的输入参数有界len
def foo(len: int):
def foob():
return len
return foob
a = foo(1)
b = foo(1)
print(a == b)
输出为 False。但是当我使用以下命令检查相等性时,
print(a.__closure__ == b.__closure__)
当输入参数len
不同时,输出似乎是 True 和 False(就像我希望它工作一样)。当我遍历这样的函数闭包签名的大型字典时,问题就出现了,其中检查的是__eq__
而不是__closure__
。有没有办法解决这个问题?
更新:问题不清楚。如果我要做这样的事情:
a_dict[foo(1)] = 0x12
即使 foo(1) 存在于字典中,它也会为 foo(1) 创建一个新的闭包对象,因为它使用__eq__
方法进行检查。
回复
我来回复-
baskettaz 评论
使用==您正在同时检查值的身份(id)和相等性。在您的情况下,它们不一样:
def foo(l): print("locals:\n") print("=======") def foob(): return l print(locals()) return foob a = foo(1) print("id(a) %s" % id(a)) b = foo(1) print("id(b) %s" % id(b)) print("IDENTICAL ? --> %s" % (a==b))
结果:
======= {'l': 1, 'foob': <function foob at 0x02934C70>} id(a) 43207792 locals: ======= {'l': 1, 'foob': <function foob at 0x02934CB0>} id(b) 43207856 IDENTICAL ? --> False
如您所见,您的foobfunciton 的身份不一样,这就是您接收False 的原因。在第二种情况下,您返回相同的值和相同的指针,这就是您得到True 的原因。
祝你好运 :)
2年前 -
baskettaz 评论
最快的方法(在我看来)是添加一些这样的键:
def foo(l): def foob(): return l foob.key = l return foob a = foo(100) b = foo(100) print(a) print(b) print(a == b) print(a.key == b.key)
结果:
<function foob at 0x028A4C70> <function foob at 0x028A4CB0> False True
通过这种方式,您将拥有要比较的函数参数和闭包,而无需混合它们。
P.S.
locals() 的闭包始终具有不同的标识-范围和比较 a == b 将始终为False
2年前