[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