[Python-Dev] Possible wrong behavior of the dict?

Brett Cannon brett at python.org
Tue Mar 17 20:12:36 CET 2015


On Tue, Mar 17, 2015 at 3:05 PM Zaur Shibzukhov <szport at gmail.com> wrote:

> Hello!
>
> 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
>         else:
>             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?
>

Yes because in your __setitem__ call you are storing the value as the Pair.
So when dict prints its repr it prints the key and value, and in this case
the value is a Pair.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20150317/0f90b3ce/attachment.html>


More information about the Python-Dev mailing list