On Mon, 14 Nov 2016 07:02 am, Antoon Pardon wrote: > > Some time ago I read a text or saw a video on iterators and one thing > I remember from it, is that you should do something like the following > when working with iterators, to avoid some pitt falls. > > def bar(iterator): > if iter(iterator) is iterator: > ... > > However I can't relocate it and can't remember the what and how anymore. > Does anyone know what this is about?
Probably something like this: def function(iterable): if iter(iterable) is iterable: print("iterable is already an iterator") assert hasattr(iterable, '__next__') # 'next' in Python 2 else: print("iterable is not an iterator") print("it may be a list, dict, string, etc.") `iter(thing) is thing` is an easy way to check whether thing is an iterator. I'm surprised that the inspect module doesn't appear to have isiterable and isiterator functions. Here's my first attempt at both: def isiterable(obj): """Return True if obj is an iterable, and False otherwise. Iterable objects can be iterated over, and they provide either an __iter__ method or a __getitem__ method. Iteration over an object tries calling the object's __iter__ method (if any), then repeatedly calls __next__ on the result until a StopIteration exception is raised (the Iterator Protocol). Otherwise, it tries calling __getitem__ with arguments 0, 1, 2, 3 ... until an IndexError exception is raised (the Sequence Protocol). """ T = type(obj) return hasattr(T, '__iter__') or hasattr(T, '__getitem__') def isiterator(obj): """Return True if obj is an iterator, and False otherwise. Iterators can be iterated over, and they provide the following methods: - __iter__ which returns itself - __next__ Iteration over an iterator repeatedly calls __next__ until a StopIteration exception is raised. """ T = type(obj) if hasattr(T, '__iter__') and hasattr(T, '__next__'): return iter(obj) is obj return False -- Steve “Cheer up,” they said, “things could be worse.” So I cheered up, and sure enough, things got worse. -- https://mail.python.org/mailman/listinfo/python-list