On Mon, Feb 9, 2015 at 5:59 PM, Chris Kaynor <ckay...@zindagigames.com> wrote: > On Mon, Feb 9, 2015 at 4:42 PM, Steven D'Aprano > <steve+comp.lang.pyt...@pearwood.info> wrote: >> so that's an excellent sign that doing so is best practice, but it should >> not be seen as *required*. After all, perhaps you have good reason for >> wanting your iterable class to only be iterated over once. > > In fact, there is one in the stdlib, the "file" object, which has a > __iter__ which returns self. The code below shows this,
Fair point. I suppose that's because the file paradigm itself has a concept of current position that can't easily be abstracted away. > The "file" object is also an example of this. It is technically a > broken iterator according to the docs: > > Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:15:05) [MSC v.1600 > 32 bit (Intel)] on win32 > Type "help", "copyright", "credits" or "license" for more information. >>>> f = open("d:/test.txt") >>>> iter(f) is f > True >>>> for l in f: > ... print(l) > ... > line 1 > > line 2 > > line 3 > >>>> for l in f: > ... print(l) > ... >>>> f.seek(0) > 0 >>>> for l in f: > ... print(l) > ... > line 1 > > line 2 > > line 3 > >>>> next(f) > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > StopIteration >>>> f.seek(0) > 0 >>>> next(f) # This should throw StopIteration as it has previously thrown >>>> StopIteration. > 'line 1\n' IIRC the docs also warn that mixing file iteration with other file methods results in undefined or broken behavior. Maybe that's only for Python 2 files, however. -- https://mail.python.org/mailman/listinfo/python-list