[Python-ideas] Inline assignments using "given" clauses

Neil Girdhar mistersheik at gmail.com
Sun May 13 13:39:44 EDT 2018

On Sun, May 13, 2018 at 12:06 PM Steven D'Aprano <steve at pearwood.info>
wrote:

> On Sat, May 12, 2018 at 08:06:02PM -0400, Neil Girdhar wrote:
> > On Sat, May 12, 2018 at 2:28 PM Steven D'Aprano <steve at pearwood.info>
> wrote:
>
> > > > * there are no difficult mental questions about evaluation order,
> e.g.,
> > > > in a bracketed expression having multiple assignments.
> > >
> > > Aren't there just?
> > >
> > >     x = 1
> > >     print( x + x given x = 50 )
> > >
> > >
> > > Will that print 100, or 51? Brackets ought to make it clearer:
> > >
> > >     (x + x given x = 50)  # this ought to return 100
> > >     x + (x given x = 50)  # this ought to return 51
> > >
> > > but if I leave the brackets out, I have no idea what I'll get.
> > >
> >
> > It has to be 100, or else outer parentheses change how an expression is
> > evaluated.
>
> Whether that it right or wrong, you're missing the point. You said that
> we don't have to care about evaluation order. But we do: even if your
> analysis is correct, not everyone will realise it. I didn't.
>

I think the way to think about "given" is the same way you think about
"for" and "if" clauses:

(x + x for x in it)

(x + x if condition else y)

(x + x where x = f(y))

>
> And I still don't, because I think your analyse is wrong.
>
> "Outer parentheses" is a red herring. I should have written:
>
>     (x + x) given x = 50  # this ought to return 100
>     x + (x given x = 50)  # this ought to return 51
>
> and now there are no outer parentheses to worry about. The question is
> now whether "given" binds more tightly than + or not.
>
> We get to choose the precedence, and whatever we choose, it will
> surprise (or annoy) some people, and more importantly, some people
> simply won't know, and will have to ponder the difficult question of
> what the evaluation order is.

> This is already true today with code that has side-effects. I can
> simulate "given" using exec. It only works in the module scope:
>
>     # another_expr given target = expr
>     exec("target = expr") or another_expr
>
> but now we can see how precedence makes a real difference:
>
> x = 1
> x + (exec("x = 50") or x)
>
> versus:
>
> x = 1
> exec("x = 50) or (x + x)
>
>
> Regardless of which behaviour we choose, some people won't know it and
> will have to deal with "difficult mental questions about evaluation
> order".
>
> That's unavoidable, regardless of how we spell it, := or "given".

>
> --
> Steve
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
> --
>
> ---
> You received this message because you are subscribed to a topic in the