[Python-Dev] PEP 572: intended scope of assignment expression

Victor Stinner vstinner at redhat.com
Thu Jul 5 08:20:01 EDT 2018


Hi,

My work (*) in the "Assignment expression and coding style: the while
True case" thread helped me to understand something about the
*intended* scope.

While technically, assignment expressions keep the same scoping rules
than assignment statements, writing "if (x := func()): ..." or "while
(x := func()): ..." shows the "intented" scope of the variable. Even
if, as explained properly in the PEP, the scope is wider (for good
reasons) as "for line in file: ..." keeps line alive after the loop
(nothing new under the sun). It's something subtle that I missed at
the first read (of the code and the PEP), the difference is not
obvious.

x = func()
if x:
    ... # obviously use x
# do we still plan to use x here?
# it's non obvious just by reading the if

versus

if (x := func()):
    ... # obviously use x
# ":=" in the if "announces" that usually x is no longer used
# here, even if technically x is still defined

See my match/group PR for more concrete examples:
https://github.com/python/cpython/pull/8097/files

I understand the current PEP 572 rationale as: assignment expressions
reduces the number of lines and the indentation level... pure syntax
sugar.

IMHO this "intended" scope is a much better way to sell assignment
expressions than the current rationale. In fact, it's explained later
very quickly in the PEP:
https://www.python.org/dev/peps/pep-0572/#capturing-condition-values

But it could be better explained than just "good effect in the header
of an if or while statement".

The PEP contains a good example of the intended scope:

if pid := os.fork():
    # Parent code
    # pid is valid and is only intended to be used in this scope
    ... # use pid
else:
    # Child code
    # pid is "invalid" (equal to zero)
    ... # don't use pid
# since this code path is common to parent and child,
# the pid is considered invalid again here
# (since the child does also into this path)
... # don't use pid


(*) My work: my current 3 pull requests showing how assignment
expressions can be
used in the stdlib:

while True: https://github.com/python/cpython/pull/8095/files
match/group: https://github.com/python/cpython/pull/8097/files
list comp: https://github.com/python/cpython/pull/8098/files

Victor


More information about the Python-Dev mailing list