why does UserDict.DictMixin use keys instead of __iter__?

Steven Bethard Steven.Bethard at colorado.edu
Tue Jan 4 05:22:22 EST 2005

Sorry if this is a repost -- it didn't appear for me the first time.

So I was looking at the Language Reference's discussion about emulating
container types[1], and nowhere in it does it mention that .keys() is
part of the container protocol.  Because of this, I would assume that to
use UserDict.DictMixin correctly, a class would only need to define
__getitem__, __setitem__, __delitem__ and __iter__.  So why does
UserDict.DictMixin require keys() to be defined?

py> class D(object, UserDict.DictMixin):
...     """Simple dict wrapper that implements container protocol"""
...     def __init__(self, dict): self.dict = dict
...     def __len__(self, key): return len(self.dict)
...     def __getitem__(self, key): return self.dict[key]
...     def __setitem__(self, key, value): self.dict[key] = value
...     def __delitem__(self, key): del self.dict[key]
...     def __iter__(self): return iter(self.dict)
...     def __contains__(self, key): return key in self.dict
py> d = D(dict(a=1, b=2))
py> d.clear()
Traceback (most recent call last):
   File "<interactive input>", line 1, in ?
   File "C:\Program Files\Python\lib\UserDict.py", line 114, in clear
     for key in self.keys():
AttributeError: 'D' object has no attribute 'keys'
py> d.keys()
Traceback (most recent call last):
   File "<interactive input>", line 1, in ?
AttributeError: 'D' object has no attribute 'keys'

I thought about submitting a patch, but I couldn't think of a way that
didn't raise backwards compatibility concerns...



More information about the Python-list mailing list