Why keys method does not work with MutableMapping?

Rob Gaddi rgaddi at highlandtechnology.invalid
Fri Nov 11 13:03:40 EST 2016


triccare triccare wrote:

> Greetings,
>
> Apologies if this has shown up twice; I jumped the gun sending before
> confirming registration.
>
> I have a class that completely implements MutableMapping, meaning that all
> the abstract methods are implemented. However, the keys method no longer
> returns the keys, but simply a repr of the instance.  Example is below.
> Same is true for the items method.
>
> It would seem that, if all the abstract methods have been implemented, the
> keys and items methods should be able to perform exactly like the native
> dict versions. There does not seem to be a need to override these methods.
>
> Thank you for your time.
> triccare
>
> Code:
>
> from collections import MutableMapping
>
> class MyDict(MutableMapping):
>
>     def __init__(self, *args, **kwargs):
>         self.data = dict(*args, **kwargs)
>
>     def __getitem__(self, key):
>         return self.data[self.__keytransform__(key)]
>
>     def __setitem__(self, key, value):
>         self.data[self.__keytransform__(key)] = value
>
>     def __delitem__(self, key):
>         del self.data[self.__keytransform__(key)]
>
>     def __iter__(self):
>         return iter(self.data)
>
>     def __len__(self):
>         return len(self.data)
>
>     def __keytransform__(self, key):
>         return key
>
> md = MyDict({'a': 1, 'b':2})
> md.keys()
> ==> KeysView(<keys.MyDict object at 0x105f7f7b8>)

Nope, that's exactly right.  That's the python3 behavior.

>>> d = {'a': 1, 'b':2}
>>> d.keys()
dict_keys(['b', 'a'])

Keys returns a dedicated keys object now, not just a list.  That thing
you got back isn't a repr string; it's the actual object.  If it were a
string it'd be quoted.

Try list(md.keys()).


-- 
Rob Gaddi, Highland Technology -- www.highlandtechnology.com
Email address domain is currently out of order.  See above to fix.



More information about the Python-list mailing list