【问题标题】:Python dictionary key not updated when executing bounded method执行有界方法时未更新 Python 字典键
【发布时间】:2021-07-08 14:49:11
【问题描述】:

我正在尝试通过订阅者/模式从 python 对象更新密钥,这是更大代码库的一部分,但我想检查我是否在这里做错了。

from dataclasses import dataclass
 
@dataclass
class A:
    a:float=2
    def mod(self,name):
        self.a = name
    def __hash__(self):
        return hash(self.a)
class B:
    x = {}
    def attach(self,object):
        self.x[object]= getattr(object,'mod')

    def dispatch(self):
        for _, val in self.x.items():
            val(3)

执行时

>>>a = A()
>>>b = B()
>>>print(a.a)
>>>b.attach(a)
>>>print(b.x)

如预期:

{A(a=2): <bound method A.mod of A(a=2)>}
>>>print(b.x[a])
<bound method A.mod of A(a=2)>

然后在执行更新时

>>b.dispatch()
>>print(b.x)
{A(a=3): <bound method A.mod of A(a=3)>}

但是当密钥被验证时:

>>>print(list(b.x.keys())[0] is a)
True

当试图检索方法时

>>>print(b.x.get(a)) 
None

【问题讨论】:

    标签: python dictionary object methods key


    【解决方案1】:

    显然问题出在哈希的定义方式上。散列应该尊重一些属性。根据link,字典需要可散列的键

    来自Official documentation

    拥有 hash() 意味着类的实例是不可变的。可变性是一个复杂的属性,它取决于程序员的意图、eq() 的存在和行为,以及 dataclass() 装饰器中 eq 和 freeze 标志的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多