New submission from Daniel Urban <urban.dani...@gmail.com>: 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. ---------- components: Library (Lib) messages: 122668 nosy: durban, rhettinger, stutzbach priority: normal severity: normal status: open title: isinstance(x, collections.Iterator) can return True, when x isn't iterable type: behavior versions: Python 3.1, Python 3.2 _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue10565> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com