[Baypiggies] Tricky dictionary iteration problem

Robert Zuber rob at zuber.net
Fri Jan 6 02:22:14 CET 2012


using super to avoid the recursion seems to work:

>>> class od2(collections.OrderedDict):
...     def __iter__(self):
...         return (v for v in super(collections.OrderedDict, self).itervalues())
... 
>>> od = od2()
>>> od['a'] = 'b'
>>> od['c'] = 'd'
>>> [v for v in od]
['b', 'd']



On Jan 5, 2012, at 4:57 PM, corey.coughlin at comcast.net wrote:

> Hi all,
>    Sorry to bug everybody, but I'm having some trouble with a somewhat tricky class I'm trying to make.  I have a class that inherits from collections.OrderedDict, in an effort to create an ordered dictionary with some extra functions.  Now what I'd like to do is to change the iteration so that when you iterate over it, it iterates over values instead of keys.  This is turning out to be harder than I thought.  First, I tried this:
> 
> class od2(collections.OrderedDict):
>     def __iter__(self):
>         return iter(self.values())
> 
> Now the code I'm running creates a dict and tries to do a .copy on it, but I'd expect the problem to come up with most kind of dictionary access.  The problem is that it goes into an infinite recursion with messages like this
> 
> File "...", line 57, in __iter__
>   return iter(self.values())
> File ".../python/2.7.1/linux64/lib/python2.7/_abcoll.py" line 372 in values
>   return [self[key] for key in self]
> 
> It looks like the values() function uses the iterator to generate the values.  OK, so maybe I'll try this:
> 
> class od2(collections.OrderedDict):
>     def __iter__(self):
>         values = [self[key] for key in self.keys()]
>         return iter(values)
> 
> that gives me messages like this:
> 
> File "...", line 56, in __iter__
>   values = [self[key] for key in self.keys()]
> File ".../python/2.7.1/linux64/lib/python2.7/_abcoll.py" line 366 in keys
>   return list(self)
> 
> and list() uses the iterator.  Gah.  So I'm out of ideas here, even if I dig into OrderedDict and find some way to pull the keys out, I'll probably have to rewrite a bunch of access functions for it to still work like a dictionary.  Am I just tilting at windmills, or is doing something like this actually possible?  Or am I just being dense, and there's a super obvious way to do this? Thanks for any help!
> 
> (Oh, and forgive me if there's a known fix for this, googling for anything along these lines just sent me to tons of tutorials about using the .values() function.  No help there.)
> 
>       ------- Corey
> _______________________________________________
> Baypiggies mailing list
> Baypiggies at python.org
> To change your subscription options or unsubscribe:
> http://mail.python.org/mailman/listinfo/baypiggies



More information about the Baypiggies mailing list