Я не совсем уверен, что это для stackoverflow, поэтому, пожалуйста, поправьте меня, если нет.
то есть. скажем, у нас есть t.py с содержанием:
class A(object):
pass
print("A:", A)
class B(object):
print("From B: A:", A)
class OuterClass(object):
class AA(object):
pass
print("AA:", AA)
class BB(object):
print("From BB: AA:", AA)
И теперь мы выполним его: $ python3 t.py
A: <class '__main__.A'>
From B: A: <class '__main__.A'>
AA: <class '__main__.AA'>
From BB: AA:
Traceback (most recent call last):
File "t.py", line 9, in <module>
class OuterClass(object):
File "t.py", line 14, in OuterClass
class BB(object):
File "t.py", line 15, in BB
print "From BB: AA:", AA
NameError: name 'AA' is not defined
Из документов:
Определение класса - это исполняемый оператор. Сначала он оценивает список наследования, если он есть. Каждый элемент в списке наследования должен оценивать объект класса или тип класса, который позволяет подклассифицировать. classs затем выполняется в новом кадре выполнения (см. раздел Именование и привязка), используя вновь созданное локальное пространство имен и оригинальное глобальное пространство имен. (Обычно набор содержит только функцию определения.) Когда класс классов завершает выполнение, его выполнение кадр отбрасывается, но его локальное пространство имен сохраняется. [4] Класс объект затем создается с использованием списка наследования для базовых классов и сохраненное местное пространство имен для словаря атрибутов. Класс имя привязано к этому объекту класса в исходном локальном пространстве имен.
Итак, я понимаю поведение, но не логическое обоснование того, что область не лексическая, как везде. Это противоречит "Особые случаи не являются достаточно сложными, чтобы нарушать правила". Почему class
ведет себя иначе, чем, скажем, def
?
Является ли это "практичностью бьет чистоту"? Если да, то какое оправдание? Первоначально я думал, что это может быть артефакт python 2.x, но, как вы можете видеть выше, поведение также присутствует в python 3.3.