атрибуты, используемые ранее, определенные в модуле - PullRequest
0 голосов
/ 20 февраля 2012

Вот код:

#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() можно найти без ошибок?

Follow Up

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

#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 ]

2 голосов
/ 20 февраля 2012

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

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

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

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


Ответ на наблюдение

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

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

Однако 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
2 голосов
/ 20 февраля 2012

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

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

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

...