On Mon, Jul 4, 2016 at 10:41 PM, Ian Kelly <ian.g.ke...@gmail.com> wrote:
> On Mon, Jul 4, 2016 at 9:20 PM, Steven D'Aprano <st...@pearwood.info> wrote:
>> I got this in Python 3.6:
>>
>>
>> py> class A:
>> ...     var = 999
>> ...     print(var)  # succeeds
>> ...     class B:
>> ...         x = var
>> ...
>> 999
>> Traceback (most recent call last):
>>   File "<stdin>", line 1, in <module>
>>   File "<stdin>", line 3, in A
>>   File "<stdin>", line 4, in B
>> NameError: name 'var' is not defined
>>
>>
>> I expected that `var` would be available during the construction of B, just
>> as it was available inside A, but not to methods inside B. Obviously my
>> expectations are invalid. Can anyone explain the actual behaviour?
>
> Class definitions don't create closures like functions do. When Python
> executes a class definition, the metaclass creates a dict, and then
> the interpreter execs the class body using that dict as the locals.
> The body of class A has one locals dict, and the body of class B has a
> completely separate locals dict. The only way to share variables
> between them (prior to the class objects actually being constructed)
> is via globals.

Or I suppose one could write a metaclass that does something fancy
when creating the dicts.
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to