In order to explain, let define subclass of dict:

class Pair:
    def __init__(self, key, val):
        self.key = key
        self.val = val

class MyDict(dict):
    def __init__(self, *args, **kwds):
        if len(args) > 1:
            raise TypeError('Expected at most 1 arguments, but got %d' % len(args))

        for key, val in args[0]:
            self[key] = val
        for key, val in kwds.items():
            self[key] = val

    def __getitem__(self, key):
        pair = dict.__getitem__(key)
        return pair.value

    def __setitem__(self, key, val):
        if key in self:
            pair = dict.__getitem__(key)
            pair.value = value
            pair = Pair(key, val)
            dict.__setitem__(self, key, pair)

    def values(self):
        for key in self:
            p = dict.__getitem__(self, key)
            yield p.value

    def items(self):
        for key, p in dict.__iter__(self):
            yield p.key, p.value

The simple test give me strange result:

>>> d = MyDict([('a', 1), ('b', 2), ('c', 3)])
>>> dict(d)
{'a': <__main__.Pair at 0x104ca9e48>,
 'b': <__main__.Pair at 0x104ca9e80>,
 'c': <__main__.Pair at 0x104ca9eb8>}

instead of {'a':1, 'b':2, 'c':3}.

Is this right behavior of the dict?

Zaur Shibzukhov