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