[Python-3000] Default dict iterator should have been iteritems()
Noam Raphael
noamraph at gmail.com
Thu Sep 6 09:15:31 CEST 2007
(Sorry, it turns out that I posted this reply only to Nick and not to
the list, so I post it again.)
On 9/4/07, Nick Coghlan <ncoghlan at gmail.com> wrote:
> Containment and iteration really do need to be kept consistent and
> having the value matter when checking for dictionary containment would
> be outright bizarre. Put the two together and it makes sense for
> dictionary iteration and containment tests to both be based on keys.
>
I absolutely agree that containment and iteration should be kept consistent.
I suggest (again, ignoring backwards compatibility completely), that
"in" would behave according to the iteration, that is, check if the
tuple (key, value) is in dict.items(). If you prefer code:
class DreamDict(dict):
def __iter__(self):
return self.iteritems()
def __contains__(self, (key, value)):
try:
myvalue = self[key]
except KeyError:
return False
return value == myvalue
Indeed, the suggested "in" operator is not very useful, so you'll
usually use has_key. But I actually think that "d.has_key(k)" is
clearer than "k in d" - There's no "syntactic" reason why "k in d"
should mean "k in d.keys()" and not "k in d.values()".*
Noam
More information about the Python-3000
mailing list