Определения Python, опирающиеся на другие неопределенные определения? - PullRequest
0 голосов
/ 26 августа 2010

Я не знал, что озаглавить, поэтому, если кто-то захочет его отредактировать: продолжайте.

def Function_A()
 print "We're going to function B!"
 Function_B()

def Function_B()
 print "We made it!'

Это вопрос новичка, но решение не пришло мне в голову, так как я был избалован скомпилированными языками. Вы можете видеть здесь, Function_A ведет к Function_B. Во время выполнения Function_B не будет определен при вызове Function_A, поэтому это не может произойти. Как мне обойти это?

Ответы [ 5 ]

5 голосов
/ 26 августа 2010

В Python функции не должны быть определены в порядке использования.Пока она определена где-то до вызова функции в время выполнения , она должна работать.Это связано с тем, что функция Function_A () фактически не оценивается до тех пор, пока она не будет вызвана, что в данном случае находится в нижней части файла this test.py, в котором функция Function_B () уже определена.

def Function_A():
    print "We're going to function B!"
    Function_B()

def Function_B():
    print "We made it!!"

Function_A()

Пример выполнения:

Махмуд: ~ $ python test.py
Мы собираемся функционировать B!
Мы сделали это!

2 голосов
/ 26 августа 2010

Как уже говорили другие, Function_B ищется, когда вызывается Function_A.Вот пример, который показывает, что Function_B может даже быть переопределен и все еще работать должным образом.

def Function_A():
    print "We're going to function B!"
    Function_B()

# Function_A() # This would cause a NameError

def Function_B():
    print "We made it!"

Function_A()

def Function_B():
    print "Function B has been redefined!"

Function_A()

вывод:

We're going to function B!
We made it!
We're going to function B!
Function B has been redefined!

2 голосов
/ 26 августа 2010

Как написано, обе функции определены, но ни одна из функций не вызывается.

Если вы вызовете Function_A до определения Function_B, вы получите ошибку:

def Function_A():
 print "We're going to function B!"
 Function_B()

Function_A() # will fail

def Function_B():
 print "We made it!"

Если вы позвоните Function_A после определения Function_B все будет работать нормально:

def Function_A():
 print "We're going to function B!"
 Function_B()

def Function_B():
 print "We made it!"

Function_A() # will succeed

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

При выполнении Function_A и достижении его второй строки интерпретатор будет искать в глобальном пространстве имен что-то, называемое Function_B.В первом примере еще ничего не определено, а во втором примере можно вызвать Function_B.

2 голосов
/ 26 августа 2010

Имена функций разрешаются во время выполнения. Поэтому, когда Function_A вызывает Function_B, имя «Function_B» не ищется до тех пор, пока Function_A фактически не вызовет. Таким образом, все работает нормально, пока Function_B определяется временем фактического вызова Function_A. Это, например, не работает:

def Function_A():
    print "Function A entered"
    Function_B()

Function_A()

def Function_B():
    print "Function B entered"

... потому что вызов Function_A предшествует определению Function_B.

1 голос
/ 26 августа 2010

У меня есть две проблемы, которые я вижу. Во-первых, вам нужны двоеточия после определения. Два: вы перепутали кавычки открытия / закрытия в вашей последней строке.

def Function_A():
 print "We're going to function B!"
 Function_B()

def Function_B():
 print "We made it!"

В противном случае этот код работает как отправлено. У меня нет проблем с запуском этих функций.

...