Message122668
If the type of x defines __next__, but not __iter__, isinstance(x, collections.Iterator) returns True, but in fact x isn't iterable.
>>> class X:
... def __next__(self):
... raise StopIteration()
...
>>> x = X()
>>> isinstance(x, collections.Iterator)
True
>>> issubclass(X, collections.Iterator)
True
>>> list(x)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'X' object is not iterable
The reason for this is that collections.Iterator.__subclasshook__ checks for a __next__ method, and if finds one, returns True. (The class provides an __iter__ mixin method, so this doesn't cause problems for classes inheriting collections.Iterator.)
A possible solution could be in collections.Iterator.__subclasshook__ checking for both required methods. |
|
Date |
User |
Action |
Args |
2010-11-28 15:58:27 | daniel.urban | set | recipients:
+ daniel.urban, rhettinger, stutzbach |
2010-11-28 15:58:27 | daniel.urban | set | messageid: <1290959907.04.0.171212908469.issue10565@psf.upfronthosting.co.za> |
2010-11-28 15:58:23 | daniel.urban | link | issue10565 messages |
2010-11-28 15:58:22 | daniel.urban | create | |
|