[Python-Dev] Examples for PEP 572 (original) (raw)

Steven D'Aprano steve at pearwood.info
Wed Jul 4 14:02:15 EDT 2018


On Wed, Jul 04, 2018 at 10:13:15AM -0700, Devin Jeanpierre wrote:

> > In Python it'd look like this: > > > > if x = expr(); x < 0:_ _> > dostuff() [...]

> Python's parser is restricted to LL(1) by design, so treating semicolons > in "if" statements as a special case might not even be possible. > But even if it is possible, not only would this special case > break the Zen, but it would be UGLY too.

It isn't a special case, and it's still LL(1). Once you encounter an "if", you parse n simple statements separated by a ";", until you reach a colon.

I'll take your word about the LL(1).

Did you actually mean arbitrary simple statements?

if import math; mylist.sort(); print("WTF am I reading?"); True: pass

A more reasonable suggestion would be to only allow assignments, not arbitrary simple statements. But that's another special case:

I don't understand why you think this is "clearly" a syntax error.

Taking the principle that semicolons separate statements, you have an if statement

if condition:

with one or more semicolon-separated statements between the "if" and the condition:

if statement; statement; condition:

If we stick to the rule that semicolons separate statements, that means we have:

if statement  # SyntaxError
statement     # okay
condition:    # SyntaxError

If we don't want that, we need a new rule to treat semicolons differently inside if statements that they're treated elsewhere.

If we applied this rule "allow statements separated by semicolons" everywhere, we'd get this:

# I trust you don't want anything even close to these
from x=1; sys import y=2; argv
data x=1; y=2; = sorted(data)
raise x=1; y=2; Exception as err:

So we have to treat semicolons inside if statements differently from semicolons everywhere else. That what I meant by saying it would be a special case.

The beauty of assignment expressions is that they AREN'T a special case. Being an expression, they're legal anywhere any other expression is allowed, and illegal anywhere where expressions aren't allowed.

-- Steve



More information about the Python-Dev mailing list