[Python-ideas] PEP 572 version 2: Statement-Local Name Bindings

Ethan Furman ethan at stoneleaf.us
Tue Mar 27 10:52:49 EDT 2018


On 03/25/2018 09:46 AM, Ethan Furman wrote:
> On 03/24/2018 09:24 PM, Nick Coghlan wrote:
>
>> No, the fact that the expression defining the outermost iterable gets evaluated in the outer scope is behaviour that's
>> explicitly tested for in the regression test suite.
>>
>> The language reference spells out that this is intentional for generator expressions, where it has the added benefit of
>> reporting errors in the outermost iterable expression at the point where the genexp is defined, rather than at the point
>> where it gets iterated over: https://docs.python.org/3/reference/expressions.html#generator-expressions
>>
>> Independently of the pragmatic "getting them to work sensibly at class scope" motivation, comprehensions inherit those
>> semantics by way of the intended semantic equivalence between "[x for x in sequence]" and "list(x for x in sequence)".
>
> Thank you (everyone!) for your patience.
>
> Using the latest example from Angelico and myself:
>
> --> d = 9
> ... def func(_iter):
> ...     ... body of comprehension
> --> func((d as e))
>
> The sticking point is the `func((d as e))`, which to my mind should happen inside the comprehension, but needs to happen
> outside -- and the reason it has to happen outside is so that the interpretor can verify that `d` actually exists;
> however, I think we can have both:
>
> --> def func(_iter):
> ...     ...
> ...     e = d
> ...     ...
> --> d
> --> func()
>
> This way, the assignment does not leak, but the referenced name is still looked up and verified to exist outside the
> function call.
>
> I don't know how easy/difficult that would be to implement.  At this point a simple confirmation that I understand and
> that in theory the above would solve both issues is what I'm looking for.  Or, of course, the reasons why the above
> would not, in theory, work.

Any insights here?  I would rather not say the same things in another thread if we can resolve this question here and be 
done with it.  :)

--
~Ethan~


More information about the Python-ideas mailing list