[Python-ideas] A comprehension scope issue in PEP 572

Nick Coghlan ncoghlan at gmail.com
Sun May 6 23:11:48 EDT 2018

On 7 May 2018 at 12:51, Nick Coghlan <ncoghlan at gmail.com> wrote:

> If any other form of comprehension level name binding does eventually get
> accepted, then inline scope declarations could similarly be used to hoist
> values out into the surrounding scope:
>         rem = None
>         while any((nonlocal rem := n % p) for nonlocal p in small_primes):
>             # p and rem were declared as nonlocal in the nested scope, so
> our rem and p point to the last bound value

Thinking about it a little further, I suspect the parser would reject
"nonlocal name := ..." as creating a parsing ambiguity at statement level
(where it would conflict with the regular nonlocal declaration statement).

The extra keyword in the given clause would avoid that ambiguity problem:

        p = rem = None
        while any(rem for nonlocal p in small_primes given nonlocal rem = n
% p):
            # p and rem were declared as nonlocal in the nested scope, so
our p and rem refer to their last bound values

Such a feature could also be used to make augmented assignments do
something useful at comprehension scope:

    input_tally = 0
    process_inputs(x for x in input_iter given nonlocal input_tally += x)


Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20180507/c98c66af/attachment.html>

More information about the Python-ideas mailing list