[Python-ideas] PEP 572: Assignment Expressions (post #4)

Chris Angelico rosuav at gmail.com
Wed Apr 11 17:55:21 EDT 2018


On Thu, Apr 12, 2018 at 4:38 AM, Ethan Furman <ethan at stoneleaf.us> wrote:
> On 04/10/2018 10:32 PM, Chris Angelico wrote:
>
>> Title: Assignment Expressions
>
>
> Thank you, Chris, for doing all this!
>
> ---
>
> Personally, I'm likely to only use this feature in `if` and `while`
> statements; if the syntax was easier to read inside longer expressions then
> I might use this elsewhere -- but as has been noted by others, the
> on-the-spot assignment creates asymmetries that further clutter the overall
> expression.
>
> As Paul noted, I don't think parenthesis should be mandatory if the parser
> itself does not require them.
>
> For myself, I prefer the EXPR as NAME variant for two reasons:
>
> - puts the calculation first, which is what we are used to seeing in
> if/while statements; and
> - matches already existing expression-level assignments (context managers,
> try/except blocks)
>
> +0.5 from me.

Context managers and except blocks don't do the same thing though, so
it's a false parallel. The 'as' keyword occurs in Python's grammar
thus:

1) "with EXPR as target:" captures the return value from __enter__
2) "except EXPR as NAME:" captures the exception value, not the type(s)
3) "import NAME as NAME" loads a module object given by a token (name)
and captures that
4) "from NAME import NAME as NAME" captures an attribute of a module

Three of them use a name, one allows arbitrary assignment targets.
(You can "with spam as ham[0]:" but you can't "except Exception as
ham[0]:".) Two of them have no expressions at all, so assignment
expressions wouldn't logically be usable. The other two are
*dangerous* false parallels, because "with foo as bar:" is
semantically different from "with (foo as bar):"; it was so awkward to
try to explain that away that I actually forbade any use of "(expr as
name)" in the header of a with/except block.

The parallel is not nearly as useful as it appears to be on first
blush. The parallel with assignment statements is far closer; in fact,
many situations will behave identically whether you use the colon or
not.

> - puts the calculation first, which is what we are used to seeing in
> if/while statements; and

Not sure what you mean here; if and while statements don't have
anything BUT the calculation. A 'for' loop puts the targets before the
evaluated expression.

> - matches already existing expression-level assignments (context managers,
> try/except blocks)

They're not expression-level assignments though, or else I'm
misunderstanding something here?

ChrisA


More information about the Python-ideas mailing list