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

Nick Coghlan ncoghlan at gmail.com
Sun May 6 23:38:25 EDT 2018

On 7 May 2018 at 13:15, Tim Peters <tim.peters at gmail.com> wrote:

> [Tim]
> >> There's a difference, though:  if `y` "leaks", BFD.  Who cares? ;-)
> >> If `y` remains inaccessible, there's no way around that.
> > Part of it is just that people seem to be fighting for the sake of
> > fighting. I'm weary of it, and I'm not going to debate this point with
> > you. You want 'em to leak? No problem. Implement it that way and I'm
> > not going to argue it.
> I'm more interested in real-life use cases than in arguments.  My
> suggestion came from staring at my real-life use cases, where binding
> expressions in comprehensions would clearly be more useful if the
> names bound leaked.  Nearly (but not all) of the time,, they're quite
> happy with that for-target names don't leak.  Those are matters of
> observation rather than of argument.

The issue is that because name binding expressions are just ordinary
expressions, they can't be defined as "in comprehension scope they do X, in
other scopes they do Y" - they have to have consistent scoping semantics
regardless of where they appear.

However, it occurs to me that a nonlocal declaration clause could be
allowed in comprehension syntax, regardless of how any nested name bindings
are spelt:

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

I don't really like that though, since it doesn't read as nicely as being
able to put the nonlocal declaration inline.


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/52da183d/attachment.html>

More information about the Python-ideas mailing list