[Python-Dev] PEP 572: intended scope of assignment expression (original) (raw)
Victor Stinner vstinner at redhat.com
Thu Jul 5 08:20:01 EDT 2018
- Previous message (by thread): [Python-Dev] PEP 484
- Next message (by thread): [Python-Dev] PEP 572: intended scope of assignment expression
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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
- Previous message (by thread): [Python-Dev] PEP 484
- Next message (by thread): [Python-Dev] PEP 572: intended scope of assignment expression
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]