[Python-ideas] Extending expressions using ellipsis
Shane Hathaway
shane at hathawaymix.org
Thu Sep 1 17:35:23 EDT 2016
On 09/01/2016 02:04 PM, Paul Moore wrote:
> Thanks. That's a nice example of how the proposal might help. But you
> could of course have written your original code as
>
> def update(names, value):
> (dbsession.query(Table1)
> .filter(Table1.name.in_(names))
> .update({'value': value})
> (dbsession.query(Table2)
> .filter(Table2.name.in_(names))
> .update({'value': value}))
>
> That's not going to completely alleviate the problem, but it does make
> the intent clearer. And it's possible that you could propose a style
> rule that a dedent in a bracketed expression is not allowed - that
> might well be something that flake8 could add, and then you'd get a
> much clearer error message (but only if you ran flake8 - if you just
> saw a syntax error from Python, you'd probably be just as likely to
> "fix" it as you said above, without even trying to run flake8). Also,
> of course, most text editors would highlight matching parentheses -
> which makes it much easier to spot the "correct" place for the missing
> parenthesis.
Good points. That style does look clearer than my example.
> One other thing, I'm not at all keen on using "..." for the syntax -
> it's almost completely invisible when I read this in gmail, and as
> others have pointed out, it already has a meaning, as Ellipsis. But I
> don't have a better suggestion to offer, I'm afraid.
Now that I remember that "..." is a literal value in Python 3
(surprise!), I've been thinking about alternatives. I wonder if a
double backslash would work. Double backslash at the end of a line is
currently a syntax error. Let's see how it looks:
def update(names, value):
dbsession.query(Table1) \\
.filter(Table1.name.in_(names))
.update({'value': value})
dbsession.query(Table2) \\
.filter(Table2.name.in_(names))
.update({'value': value})
That looks OK to me right now. Double backslash seems to convey the
idea that it's not only a line continuation, but a line continuation
with special properties.
I would never write it this way, BTW:
def update(names, value):
dbsession.query(Table1) \
.filter(Table1.name.in_(names)) \
.update({'value': value})
dbsession.query(Table2) \
.filter(Table2.name.in_(names)) \
.update({'value': value})
I never seem to be able to sprinkle those single backslashes in the
right places consistently. I forget one, or I leave one in after
rearranging lines, leading to mayhem.
> Also, it's very definitely "yet another way to
> write expressions across multiple lines". But the indented expression
> format is pretty readable for cases when you *do* have a long
> expression and no convenient way to bracket it.
Well, you could say the same about triple quoted strings. Sure there
are other ways to write strings longer than a single line, but triple
quoted strings are clearly worth the extra parser complexity.
Shane
More information about the Python-ideas
mailing list