On Nov 14, 2019, at 10:33, Guido van Rossum <gu...@python.org> wrote:
> 
> I would not be a fan of this approach (even though I agree it's technically 
> feasible). The problem is that if a user simply forgets the colon at the end 
> of a line (surely a common mistake), the modified parser would produce a much 
> more confusing error on a subsequent line.

Yeah, that’s what I meant about error reporting getting worse rather than 
better.

Presumably it would be similar to this existing case:

    a = (b+c
    d = a*a

… where you get a SyntaxError on the second line, where the code looks 
perfectly valid (because out of context it would be perfectly valid).

This is something that every novice runs into and gets confused by (usually 
with a more complicated expression missing the close parens), but we all get 
used to it and it stops bothering us. Would the same thing be true for colons? 
I don’t know. And, even if it is, is the first-time hurdle a worse problem than 
the one we’re trying to solve? Maybe.

> With the PEG parser we could support this:
> 
> with (
>     open("file1") as f1,
>     open("file2") as f2,
> ):
>     <code>
> 
> But there would still be an ambiguity if it were to see
> 
> with (
>     lock1.acquire(),
>     lock2.acquire(),
> ):
>     <code>
> 
> Is that a simple tuple or a pair of context managers that are not assigned to 
> local variables? I guess we can make it the latter since a tuple currently 
> fails at runtime, but the ice is definitely thin here.

Yeah, the tuple ambiguity is the first thing that comes up every time someone 
suggests parens for with. To a human it doesn’t look ambiguous, because how 
could you ever want to use a tuple literal as a context manager, but the 
question is whether you can make it just as unambiguous to the parser without 
making the parser to complicated to hold in your head.

I think it could be done with the current parser, but only by making with_item 
not use expression and instead use a expression-except-tuple production, but 
that would require a couple dozen parallel sub productions to build up to that 
one, which sounds like a terrible idea. And I’m not even 100% sure it would 
work (because it still definitely needs to allow other parenthesized forms, 
just not parenthesized tuples).

I think it could also be done by letting the grammar parse it as a tuple and 
then having an extra (non-declarative) fixup step. But that obviously makes 
parsing more complicated to think through, and to document, etc.

If it’s easy to do with a PEG parser, and if there are independent reasons to 
switch to a PEG parser, maybe that’s ok? I don’t know. It is still more 
complicated conceptually to have a slot in the grammar that’s “any expression 
except a parenthesized tuple”.

That’s why I thought random’s suggestion of just allowing compound statement 
headers to be multiline without requiring parens seemed potentially more 
promising than the original (and frequent) suggestion to add parens here.
_______________________________________________
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/BEQRGPL3SKEYB4FZXAUCFVYR5MROEQBJ/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to