> On Dec 11, 2019, at 07:43, Daniel Moisset <dfmois...@gmail.com> wrote:
> I think a solution nobody has proposed in this thread is relaxing the next 
> builtin, so it calls iter() on the argument when it doesn't implement the 
> iterator protocol. That would make next([1, 2]) == 1, and also make next([], 
> "missing") == "missing".

    while True:
        yield (next(it), next(it))

I’ve seen this in real-life code, and more complicated versions of the same 
idea. What does it do? It gives you pairs of elements from it (not overlapping 
ones like pairwise, but adjacent ones). But with your chain, that’s no longer 
true. It gives you pairs of elements if it is an Iterator, infinite pairs of 
the first element twice if it’s a container. That’s no longer a useful function.

And consider Steven’s case of processing a file with a header. Even when you 
don’t need the optional second line of hyphens, it’s still a problem. The 
standard way to write that is:

    def process(lines):
        header = next(lines, '')
        for line in lines:
            do_stuff(header, line)

And with your change, calling it with a container (say because you called 
readlines, which you should almost never do but people actually do all the 
time) means it will fail silently and subtly instead of raising.

> Compatibility-wise, it potentially turns TypeError raising code into 
> non-raising code, which might make a difference if someone is catching this 
> and doing something special with it, but IMHO I don't think that's something 
> that should happen a lot 

If someone is checking for an Iterator by EAFP’ing next instead of LBYL’ing 
collections.abc.Iterator, this would break their code. I don’t know how often 
people do that, but I don’t think code that does that would be wrong or bad; 
using EAFP instead of LBYL is usually considered a good thing in Python.

But also, most of the time, even when you aren’t testing for the error, you’re 
relying on it. The pairs and process functions above are only correct because 
of that TypeError. Take it away, and the standard idioms for at least two 
common things are no longer valid.
_______________________________________________
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/FDEPFJ5TPFVATLDGW6YNM6KX25LO32D4/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to