[Python-Dev] Informal educator feedback on PEP 572 (was Re: 2018 Python Language Summit coverage, last part) (original) (raw)
Paul Moore p.f.moore at gmail.com
Mon Jun 25 09:46:31 EDT 2018
- Previous message (by thread): [Python-Dev] Informal educator feedback on PEP 572 (was Re: 2018 Python Language Summit coverage, last part)
- Next message (by thread): [Python-Dev] Informal educator feedback on PEP 572 (was Re: 2018 Python Language Summit coverage, last part)
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On 25 June 2018 at 13:24, Nick Coghlan <ncoghlan at gmail.com> wrote:
On 25 June 2018 at 22:17, Nick Coghlan <ncoghlan at gmail.com> wrote:
FWIW, the most cryptic parent local scoping related exception I've been able to devise so far still exhibits PEP 572's desired "Omitting the comprehension scope entirely would give you the same name lookup behaviour" semantics:
>>> def outer(x=1): ... def middle(): ... return [x := x + i for i in range(10)] ... return middle() ... >>> outer() Traceback (most recent call last): ... NameError: free variable 'x' referenced before assignment in enclosing scope It isn't the parent local scoping, or even the assignment expression, that's at fault there, since you'd get exactly the same exception for: def outer(x=1): def middle(): x = x +1 return x return middle() Oops, I didn't mean to say "exactly the same exception" here, as the whole reason I'd settled on this example as the most cryptic one I'd found so far was the fact that the doubly nested version doesn't give you the same exception as the singly nested version: the version without the comprehension throws UnboundLocalError instead.
At the level of "what my intuition says" the result is the same in both cases - "it throws an exception". I have no intuition on which exception would be raised and would experiment (or look up the details) if I cared.
However, the resolution is the same either way: either 'x' has to be declared as 'nonlocal x' in 'middle', or else it has to be passed in to 'middle' as a parameter.
Once someone told me that's what I needed, it's sufficiently obvious that I'm fine with that. If no-one was able to tell me what to do, I'd simply rewrite the code to be less obfuscated :-)
I've probably explained my intuition enough here. If we debate any further I'll just end up knowing what's going on, destroying my value as an "uninformed user" :-) Paul
- Previous message (by thread): [Python-Dev] Informal educator feedback on PEP 572 (was Re: 2018 Python Language Summit coverage, last part)
- Next message (by thread): [Python-Dev] Informal educator feedback on PEP 572 (was Re: 2018 Python Language Summit coverage, last part)
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]