【问题标题】:emulating dict interface python模拟dict接口python
【发布时间】:2018-05-10 01:47:15
【问题描述】:

由于某种原因,我无法完美地模拟我的类型的字典行为。

class IValType:
    def __init__(self, v):
        self.v = v

    def __repr__(self):
        return self.v.__repr__()

    def __str__(self):
        return self.v.__str__()

    def __eq__(self, other):
        return self.v.__eq__(other)

class Map(IValType, dict):
    def __init__(self, v: dict):
        super(Map, self).__init__(v)
        print("debug")

    def __contains__(self, item):
        return self.v.__contains__(item)

    def __getitem__(self, item):
        return self.v[item]

    def __setitem__(self, key, value):
        self.v[key] = value

    def __delitem__(self, key):
        self.v.__delitem__(key)

    def __missing__(self, key):
        return self.v.__missing__(key)

    def __get__(self, instance, owner):
        return self.__get__(instance, owner)

    def __iter__(self):
        return self.v.__iter__()

    def __len__(self):
        return len(self.v)

    @staticmethod
    def fromkeys(seq):
        return dict.fromkeys(seq)

    def values(self):
        return self.v.values()

    def keys(self):
        return self.v.keys()

    def items(self):
        return self.v.items()

    def pop(self, k):
        return self.v.pop(k)

    def popitem(self):
        return self.v.popitem()

    def setdefault(self, k, default=None):
        return self.v.setdefault(k, default)

    def get(self, k):
        return self.v.get(k)

    def update(self, __m, **kwargs):
        self.v.update(__m, **kwargs)

相等性测试失败。

class MainTest(unittest.TestCase):

    def test_4(self):
        # make a full test for dicts
        d = {"k": 1,"p":2}
        dm = Map(d)
        self.assertIn("k", dm)
        self.assertEqual(dm["k"], d["k"])
        self.assertDictEqual(dm,d)

AssertionError: {'p': 2, 'k': 1} != {'p': 2, 'k': 1}
- {'p': 2, 'k': 1}
+ {'k': 1, 'p': 2}

我已经实现了几乎所有神奇的方法,我缺少什么?以同样的方式重新实现列表我没有这些麻烦,并且它们也被测试(成功)是否相等。这是 py 3.5

有什么帮助吗?

【问题讨论】:

  • 是的,它继承自IValType.__eq__
  • 我做到了。在 IValType 中
  • def keys(self): return self.keys() => def keys(self): return self.v.keys() 或者重新定义方法没用。
  • @dgan,哎呀,我错过了,对不起。
  • keys(self): 已更正,结果是一样的,还是谢谢你

标签: python dictionary


【解决方案1】:

您的问题是缺少实现不等于,这是assertDictEqual 内部使用的(参见here):

>>> dm != d
True

IValType 定义__ne__

这也可能是unittest.TestCase 中的一个错误,因此您可以考虑在bugs.python.org 提交问题和/或切换到a better test runner

【讨论】:

  • 好吧,我们过去遇到过一些问题,但这看起来是正确的答案。
猜你喜欢
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多