Атрибуты, используемые ранее, определенные в модуле
Вот код:
#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__()
вызывается и вызывается после того, как все определение класса было просмотрено.