[Python-Dev] PEP 572: Assignment Expressions

Nick Coghlan ncoghlan at gmail.com
Sat Apr 21 03:52:19 EDT 2018


On 21 April 2018 at 17:11, Steven D'Aprano <steve at pearwood.info> wrote:
> So can you explain specifically what odd function-scope behaviour you
> are referring to? Give an example please?

Once we allow name binding as an expression, there are three main
cases to consider in comprehensions:

1. Name binding in the result expression
2. Name binding a filter expression
3. Name binding in an iterable expression

The first two cases are fine (they happen in the implicit nested
scope, and hence don't affect the scope containing the comprehension),
but the behaviour in the third case bothered people, because it broke
down into two distinct subcases:

3a. For the outermost iterable, the binding always happens in the
surrounding scope, and hence will not be accessible from the rest of
the comprehension when used at class scope.
3b. For any nested iterables, the binding happens in the implicit
nested scope, as for other comprehension subexpressions

In the original version of PEP 572 (the one with sublocal scopes), the
consequences of 3a were just that you couldn't meaningfully use
assignment expressions in the outermost iterable expression of a
comprehension, since neither the implicitly nested scope nor the
surrounding scope would be able to see them. Too bad, so sad, don't do
that then (since it's pointless).

In the revised version of PEP 572 that just used regular local
assignment, the side effects of 3a were more concerning, since they
meant that we'd be bringing back the comprehension variable leakage
problem, albeit in a far more esoteric form. Even less defensibly, the
construct would just work at function scope, work, but define an
unexpected module attribute at module scope, and simply not work at
all at class scope. Hence the changes to the PEP to move even the
evaluation of the outermost iterable inside the implicitly nested
scope, rather than leaving it outside the way it is now.

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia


More information about the Python-Dev mailing list