[Python-3000] have iter(mapping) generate (key, value) pairs

Nick Coghlan ncoghlan at gmail.com
Sat Jun 3 01:54:33 CEST 2006


Steven Bethard wrote:
> Note that even though the `Language Reference`_ defines mappings in
> terms of __len__, __getitem__, __setitem__, __delitem__ and __iter__,
> UserDict.DictMixin.update has to assume that all mappings have a
> .keys() method.

A slightly different proposal:

Add an iteritems() builtin with the following definition:

     def iteritems(obj):
         # Check for mapping first
         try:
             items = obj.items      # or __items__ if you prefer
         except AttributeError:
             pass
         else:
             return iter(items())
         # Check for sequence next
         if hasattr(obj, "__getitem__"):
             return enumerate(obj)
         # Fall back on normal iteration
         return iter(obj)

Then update the language reference so that the presence of of an items() (or 
__items__()) method is the defining characteristic that makes something a 
mapping instead of a sequence. After all, we've been trying to think of a way 
to denote that anyway.

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia
---------------------------------------------------------------
             http://www.boredomandlaziness.org


More information about the Python-3000 mailing list