Line-continuation "Anti-Idiom" and with statement
Terry Reedy
tjreedy at udel.edu
Mon Nov 23 20:09:18 EST 2009
MRAB wrote:
> Neil Cerutti wrote:
> > I installed Python 3.1 today, and I've been porting my small
> > library of programs to the new system.
> >
> > I happened to read the interesting "Idioms and Anti-Idioms"
> > HOWTO, and saw the '\' continuation character labeled an
> > anti-idiom. I already generally avoided it, so I just nodded.
> >
> > Unfortunately, the new "nested" with statement (which I also read
> > about today) forces me into this anti-idiom. When replacing an
> > appearance of contextlib.nested with the 3K with statement, I
> > ended up with an unexpected syntax error.
> >
> > with (open(roster_path, 'r') as roster_file,
> > open(disb_path, 'w') as out_file,
> > open(report_path, 'w') as report_file):
> >
> > The result was:
> >
> > File "C:\project\codxml.py", line 184
> > with (open(roster_path, 'r') as roster_file,
> > ^
> > SyntaxError: invalid syntax
> >
> > Unless I'm missing something, I have to subject my code to a bit
> > of contintuation:
> >
> > with open(roster_path, 'r') as roster_file,\
> > open(disb_path, 'w') as out_file,\
> > open(report_path, 'w') as report_file:
> >
> > I was thinking about submitting a enhancement request to the
> > HOWTO, explaining that continuation my be required in this
> > context. Am I missing anything obvious?
> >
> The relevant syntax is:
>
> with_stmt ::= "with" with_item ("," with_item)* ":" suite
>
> with_item ::= expression ["as" target]
>
> Parentheses only work around an expression or when they are expected by
> the syntax, eg in function calls.
>
> In this case it sees the '(' and thinks that it's the start of a
> parenthesised expression. It parses the expression, then sees 'as',
> hence a SyntaxError. I suppose it could've complained about a missing
> ')' instead.
>
> I wonder whether an end-of-line could be ignored after a comma in a
> 'with' statement, and, for consistency, in any similar cases.
Then a line ending with ', ' would be different from one ending with
',', useless space and tabs at ends of lines were *always* ignored. Not
sure whether that would create problems though.
More information about the Python-list
mailing list