Атрибуты, используемые ранее, определенные в модуле

Вот код:

#a.py
ALL_FUNC = [bar, foo]  #a list containing all the functions defined in this module

def bar():
    pass

def foo():
    pass

Затем я запускаю его так: $ python a.py NameError: имя 'bar' не определено

Ошибка означает, bar не определяется, когда ALL_FUNC = [bar, foo] выполнен. Но почему переводчик не может найти функцию bar в модуле? Просто так bar определяется после ALL_FUNC?

Посмотрите на это, вот класс Python,

class A:
    def __init__(self):
        self.bar()

    def bar(self):
        pass

a = A()

Видимо, приведенный выше код будет работать без каких-либо ошибок, но bar в A также определяется после того, где к нему обращаются (в __init__), Зачем self.bar() можно найти без ошибок?

Следовать за

Вот еще один модуль,

#b.py
def bar():
    print k  #well, apparently this line will result in an error
def foo():
    pass

if __name__ == '__main__':
    foo()

Затем запустите это так,

$ python b.py

НЕТ ОШИБОК! Зачем? bar должен привести к ошибке, не так ли? Просто потому, что он не используется в __main__, так что ошибка не обнаружена? Но barопределение выполнено, верно?

2 ответа

Но почему интерпретатор не может найти функциональную панель в модуле? Просто потому, что бар определен после ALL_FUNC?

Поскольку код выполняется в порядке, он появляется в файле. Где вы пытаетесь присвоить значения ALL_FUNC определения функций не были выполнены.

но бар в A также определяется после того, где к нему обращаются (в __init__ ), Зачем self.bar() можно найти без ошибок?

Так как __init__ был вызван после того, как класс был определен. Ваш класс создан a = A() после определения класса.


Ответ на продолжение

Зачем? bar должен привести к ошибке, не так ли? Просто потому, что он не используется в __main__ , так что ошибка не обнаружена? Но определение бара выполнено, верно?

Если вы позвонили bar() ты бы получил NameError, Когда вы определили bar функция, код функции был интерпретирован, а не выполнен. Я не уверен, что это когда-нибудь подхватит SyntaxError с, но определенно нет NameError s.

Тем не мение, bar не всегда приводит к ошибке. Рассматривать:

>>> def bar():
...   print(k)
...
>>> bar()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in bar
NameError: global name 'k' is not defined
>>> k = "Foo"
>>> bar()
Foo

Интерпретатор выполняет скрипт сверху вниз.

def это исполняемый оператор. Любое имя, созданное def (такие как foo а также bar в вашем первом примере) не существует, пока не def заявление было выполнено.

Теперь к вашему второму примеру: имя self.bar() разрешается, когда __init__() вызывается и вызывается после того, как все определение класса было просмотрено.

Другие вопросы по тегам