On Sun, Nov 28, 2021, 11:43 PM Paul Bryan <pbr...@anode.ca> wrote:

> According to https://docs.python.org/3/glossary.html#term-iterator and
> https://docs.python.org/3/library/stdtypes.html#typeiter, iterators must
> implement the __iter__ method.


>From your first link:

CPython implementation detail: CPython does not consistently apply the
> requirement that an iterator define __iter__().


That said, I don't think the description at the link is very good.  Anyway,
it's different from what I teach, and also different from how Python
actually behaves.  E.g.:

>>> class Foo:
...     def __iter__(self):
...         return Bar()
...
>>> class Bar:
...     def __next__(self):
...         if random() > 0.5:
...             raise StopIteration
...         return "Bar"
...
>>> for x in Foo():
...     print(x)
...
Bar
Bar
Bar


Or anyway, what would you call `bar := Bar()` if not "an iterator?!

On Sun, 2021-11-28 at 22:02 -0500, David Mertz, Ph.D. wrote:
>
> On Sun, Nov 28, 2021, 8:59 PM Steven D'Aprano
>
> To be an iterator, your object needs:
>
> 1. a `__next__` method which returns the next value;
> 2. and an `__iter__` method which returns self.
>
>
> That's not quite right.
>
> An iterator only needs .__next__(), and an iterable only needs
> .__iter__(). Returning self is a convenient, and probably the most common,
> way of creating an object that is both. But exceptions exist, and remain
> iterators and/or iterables.
>
>
>
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/ZDJYJ4322M2JKKQATFGGC7B6P7GRPJYE/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to