[Python-Dev] PEP 572: Assignment Expressions

Tim Peters tim.peters at gmail.com
Sat Apr 21 15:20:21 EDT 2018


[Christoph Groth <christoph at grothesque.org>]
> Tim, thanks for this clear analysis.  Here's the best use case of more
> general assignment expressions that I can come up with (from real code
> I'm currently working on):
>
> class Basis:
>     def __init__(self, parent, periods=()):
>         self._parent = parent
>         if len(self._periods := np.asarray(periods, int)):
>             ...
>         else:
>             # In absence of periods, treat them as an (0, n)-shaped array.
>             # This avoids a special code path below.
>             self._periods = np.empty((0, len(parent.periods)), int)
>
> But since this is a weak counterexample, it actually serves to
> strengthen your point that
>
>     identifier ":=" expression
>
> is all that is needed.

That's a decent example.  In truth, I have no real objection to
binding an attribute - but am willing to throw out a bit of soap with
the bathwater if doing so can avoid throwing the baby out too ;-)


> Such minimal assignment expressions have the (IMHO important) advantage
> of not being inconsistent with assignment statements.
>
> ----------------
>
> Still, it seems weird to have two different ways of binding names in the
> language where one would be sufficient (i.e. the old one would remain
> only for backwards compatibility).  From the point of view of someone
> who's new to the language that's two things to learn instead of just
> one.

But they're very different in a key respect.  the value of an
assignment expression is the value assigned.  Asking "what's the value
of a statement?" doesn't even make sense in Python (whether an
assignment statement or any other kind of statement).

For that reason, _if_ a PEP is reworked to suggest a "binding
expression" (I'd prefer the name change to nudge people away from
conflating it with the far more general assignment statement), the
usage pragmatics are clear:  use a binding expression if the context
requires using the value bound, else use a simple assignment
statement.

":=" doesn't _just_ mean "bind the simple name on the left" in that
world, but also "and return the value of the expression on the right".

For that reason, e.g.,

    i = 1

would be strongly preferred to

    i := 1

as a standalone line, except perhaps when typing at an interactive
shell (where you may _want_ to see the value being bound - but usually
don't).


More information about the Python-Dev mailing list