[Tutor] FrozenDict

Steven D'Aprano steve at pearwood.info
Fri Oct 9 03:18:46 CEST 2015


On Thu, Oct 08, 2015 at 12:03:28PM +0100, Oscar Benjamin wrote:
> On 8 October 2015 at 01:47, Steven D'Aprano <steve at pearwood.info> wrote:
> > In 3.3, you will have a problem that FrozenDict is not a proper
> > iterator. You can't set self.__next__ = self.next, that won't work.
> > Dunder methods have to be on the class, not on the instance, so instead
> > of making the assignment in the __init__ method, put this in the body of
> > your class:
> >
> >     def next(self):
> >         # Python 2 method
> >         ...
> >
> >     __next__ = next  # Python 3 method.
> >
> >
> > Unfortunately that's not enough to get it working in Python 3. I need
> > more time to think about that.
> 
> There shouldn't be a __next__ method on the FrozenDict class. __iter__
> should return a distinct iterator. Albert has already fixed this by
> using:
> 
>     def __iter__(self):
>         return iter(self.__kwargs)


That's one solution, but it is certainly possible for the class to be 
its own iterator, in which case it needs to follow two rules:

(1) self.__next__() needs to return the next value, or raise 
StopIteration;

(2) self.__iter__() needs to return self;


and of course like all dunder methods __next__ and __iter__ need to be 
defined on the class itself, not on the instance.


Just returning iter(values) is probably much easier, but not as much fun 
:-)



-- 
Steve


More information about the Tutor mailing list