比较 Python 中的闭包

xiaoxingxing 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__方法进行检查。

原文链接:https://stackoverflow.com//questions/71463677/comparing-closures-in-python

回复

我来回复
  • baskettaz的头像
    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年前 0条评论
  • baskettaz的头像
    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年前 0条评论