Почему имя переменной, которой назначается _to_, влияет на поиск значения? - PullRequest
3 голосов
/ 14 февраля 2011

В python отлично работает следующее:

def test_foo():
    class Foo(object):
        pass
    class Fam(object):
        bar = Foo

test_foo()

Однако при NameError: name 'Foo' is not defined произойдет сбой:

def test_foo():
    class Foo(object):
        pass
    class Fam(object):
        Foo = Foo

test_foo()

Почему имя, которое я назначаю для , влияет на поиск назначаемого значения?

1 Ответ

6 голосов
/ 14 февраля 2011

Тот факт, что вы присваиваете имя Foo внутри определения класса, делает имя Foo локальным именем в этой области (т. Е. Область действия класса).Локальные имена определяются статически, во время синтаксического анализа и компиляции в байт-код.Когда выполнение достигает оператора

Foo = Foo

, Python сначала оценивает правую часть.Он ищет локальное имя Foo - как определено во время компиляции - и не может найти его в локальной области видимости.Отсюда ошибка.

То же самое произойдет, если вы попытаетесь

def test_foo():
    foo = 3
    class A:
        bar = foo
        foo = 42

test_foo()
...