On Wed, Sep 15, 2021 at 3:54 PM Ethan Furman <et...@stoneleaf.us> wrote:

> Guido:
>  > It's still an iterator, since it duck-types in most cases where an
> iterator
>  > is required (notably "for", which is the primary use case for the
> iteration
>  > protocols -- it's in the first sentence of PEP 234's abstract).
>
> D'Aprano:
>  > I don't think it duck-types as an iterator. Here's an example:
>  >
>  > class A:
>  >     def __init__(self): self.items = [1, 2, 3]
>  >     def __next__(self):
>  >         try: return self.items.pop()
>  >         except IndexError: raise StopIteration
>  >
>  > >>> for item in A():  pass
>  > ...
>  > Traceback (most recent call last):
>  >   File "<stdin>", line 1, in <module>
>  > TypeError: 'A' object is not iterable
>
> Guido:
>  > Yes, we all understand that. The reason I invoked "duck typing" is that
> as
>  > long as you don't use the iterator in a situation where iter() is called
>  > on it, it works fine.
>
>
> I'm confused.
>
> - a "broken" iterator should be usable in `for`;
> - `A` is a broken iterator;
>
> but
>
> - `A()` is not usable in `for`.
>
> What am I missing?
>

Steven's class A is the kind of class a custom sequence might return from
its __iter__ method. E.g.

class S:
    def __iter__(self):
        return A()

Now this works:

for x in S(): ...

However this doesn't:

for x in iter(S()): ...

In Steven's view, A does not deserve to work in the former case: Because A
is a "broken" iterator, he seems to want it rejected by the iter() call
that is *implicit* in the for-loop.

Reminder about how for-loops work:

This:

for x in seq:
    <body>

translates (roughly) to this:

_it = iter(seq)
while True:
    try:
        x = next(_it)
    except StopIteration:
        break
    <body>

-- 
--Guido van Rossum (python.org/~guido)
*Pronouns: he/him **(why is my pronoun here?)*
<http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/>
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/HS5TCRWR2QABQCOCM5JDW4642KXWO7XR/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to