“映射”dictonary类中的错误

问题描述 投票:3回答:1

我正在尝试创建一个简单的映射类,其中当键为1-1时,例如key1:key2, key2:key1。当我检查班级是否等于我输入的值时,我遇到了一个错误,我应该得到True但我一直得到False

>>> m=Mapping()
>>> m[2]=3
>>> m
Mapping({2: 3, 3: 2})
>>> m==Mapping({2: 3, 3: 2})
False

我不确定我做错了什么,我的代码在下面,任何帮助将不胜感激。

class Mapping():
    def __init__(self, dic={}):
        self.Dict = dict(dic)
    def __repr__(self):
        return "Mapping({})".format(self.Dict)
    def __getitem__(self, loc=0):
        return self.Dict[loc]
    def pop(self, popn=0):
        popm = self.Dict[popn]
        self.Dict.pop(popn, None)
        self.Dict.pop(popm, None)
    def __setitem__(self, x, y):
        self.Dict[x]=y
        self.Dict[y]=x
python
1个回答
6
投票

你的Mapping类必须实现__eq__魔法,才能使==正常工作。如果Mappings相等,假设两个Dict相等,你可以试试这样的:

    def __eq__(self, other):
        if isinstance(other, Mapping):
            return self.Dict == other.Dict
        return False

如果没有这个,==将回过头来检查这些是否是同一个实例,即is的作用。


通常,当你实现__eq__时,你也会实现__hash__方法,所以两者是一致的。同样,您可以简单地委托self.Dict获取哈希值,但dict不可清除(有充分理由,请参阅下文),但您可以对项目进行哈希处理:

    def __hash__(self):
        return hash(frozenset(self.Dict.items()))

没有__hash__,你可以例如不要将你的Mapping类用作另一个字典中的键。然而,这种设置是有问题的,因为dict是可变的,所以hash(m)可能会在使用之间发生变化,因此无法在以后从Mappingdict中检索set

© www.soinside.com 2019 - 2024. All rights reserved.