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

Ivan Pozdeev vano at mail.mipt.ru
Thu Jul 5 11:48:56 EDT 2018


On 05.07.2018 15:20, Victor Stinner wrote:
> 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

The construct for temporary variables is `with'. `if' carries no such 
implications.

> 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
> _______________________________________________
> Python-Dev mailing list
> Python-Dev at python.org
> https://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe: https://mail.python.org/mailman/options/python-dev/vano%40mail.mipt.ru



More information about the Python-Dev mailing list