“映射”dictonary类中的错误

时间:2017-01-30 15:53:08

标签: python

我正在尝试创建一个简单的映射类,其中当键为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

1 个答案:

答案 0 :(得分: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)可能会在使用之间发生变化,从而无法从Mapping或{{1}检索dict以后。