Mark Dickinson <dicki...@gmail.com> added the comment:

[I wrote this before Serhiy posted his reply; sending it anyway, in case the 
doc links are useful.]

This is documented, by-design behaviour. Essentially name resolution skips 
class scopes.

See 
https://docs.python.org/3/reference/executionmodel.html#resolution-of-names, 
and particularly the example at the end of that section, which is very similar 
to your example.

See also: 
https://docs.python.org/3/reference/expressions.html#displays-for-lists-sets-and-dictionaries,
 and in particular this part:

> However, aside from the iterable expression in the leftmost for clause,
> the comprehension is executed in a separate implicitly nested scope.
> This ensures that names assigned to in the target list don’t “leak” into
> the enclosing scope.

That "leftmost for clause" bit explains why, in the following example, the 
first comprehension is evaluated successfully, but the second raises a 
`NameError`.

>>> class A:
...     a = 3
...     b = [x+y for x in range(a) for y in range(3)]  # okay
...     c = [x+y for x in range(3) for y in range(a)]  # raises

----------
nosy: +mark.dickinson -serhiy.storchaka
resolution: duplicate -> not a bug
stage: resolved -> 
superseder: improper scope in list comprehension, when used in class 
declaration -> 

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue34517>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to