Pattern for object model compatibility isn't friendly for subclasses
|Reported by:||aaugustin||Owned by:||aaugustin|
|Has patch:||no||Needs documentation:||no|
|Needs tests:||no||Patch needs improvement:||no|
In the Python 3 documentation I recommended the following pattern for iterators:
class MyIterator(object): def __iter__(self): return self # implement some logic here def __next__(self): raise StopIteration # implement some logic here next = __next__ # Python 2 compatibility
A downside is that if a subclass overrides __next__, it also has to repeat next = __next__. This is tricky.
This problem cannot cause regressions for people who have working code on Python 2, because they override next, not __next__. However I'd like to take advantage of six.Iterator since it's technically more correct.
The same problem exists with __nonzero__ = __bool__, __div__ = __truediv__ and __idiv__ = __truediv__.
We could use a slightly more verbose pattern:
class Foo(object): def __nonzero__(self): return self.__bool__()
six.Iterator uses type(self).__next__(self) rather than self.__next__(). I assume there's a good reason but I haven't figured it out. I'd like to understand it before making a decision.
Change History (3)
comment:1 Changed 4 years ago by aaugustin
- Owner changed from nobody to aaugustin
- Status changed from new to assigned
- Triage Stage changed from Unreviewed to Accepted
comment:2 Changed 4 years ago by Aymeric Augustin <aymeric.augustin@…>
- Resolution set to fixed
- Status changed from assigned to closed