On 7 May 2018 at 13:15, Tim Peters <tim.peters@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.

Cheers,
Nick.

--
Nick Coghlan   |   ncoghlan@gmail.com   |   Brisbane, Australia