Вы не можете переслать функции в Python. Это не имеет большого смысла, потому что Python динамически типизирован. Вы могли бы сделать что-то глупое, как это, и что можно ожидать от этого?
foo = 3
foo()
def foo():
print "bar"
Очевидно, что вы пытаетесь __call__
int
объекта на 3. Это абсолютно глупо.
Вы спрашиваете, можете ли вы форвард-объявить, как в C/C++. Ну, вы обычно не запускаете C через переводчика. Однако, хотя Python равен compiled to bytecode, программа python3
является интерпретатором.
Форвардное объявление на скомпилированном языке имеет смысл, потому что вы просто устанавливаете символ и его тип, а компилятор может несколько раз пропустить код, чтобы понять его. Однако, когда вы используете интерпретатор, вы, как правило, не можете обладать этой роскошью, потому что вам нужно будет пропустить оставшуюся часть кода, чтобы найти смысл этого форвардного объявления, и пропустите его снова, выполнив это.
Вы можете, конечно, сделать что-то вроде этого:
foo = lambda: None
foo()
def foo():
print "bar"
Но вы инстанцирован foo
тем не менее. Все должно указывать на фактический, существующий объект в Python.
Это не относится к def
или class
операторам. Они создают объект function
или class
, но они еще не выполняют код внутри. Таким образом, у вас есть время для создания объектов внутри них до того, как их код будет запущен.
def foo():
print bar()
# calling foo() won't work yet because you haven't defined bar()
def bar():
return "bar"
# now it will work
Разница в том, что вы просто создали function
объекты с именами переменных foo
и bar
представляющих их соответственно. Теперь вы можете ссылаться на эти объекты по этим именам переменных.
Что касается способа интерпретации Python (в CPython), вы должны убедиться, что вы не выполняете код в своих модулях, если они не запускаются в качестве основной программы или если вы не хотите, чтобы они что-то делали при импорте (редкий, но действительный случай). Вы должны сделать следующее:
- Положить код, предназначенный для выполнения функций и определений классов.
- Если код не имеет смысла быть выполненным в основной программе, поместите его в другой модуль.
- Используйте команду
if __name__ == "__main__":
, чтобы создать блок кода, который будет выполняться только в том случае, если программа является основной программой.
Фактически, вы должны сделать третий во всех своих модулях. Вы можете просто написать это в нижней части каждого файла, который вы не хотите быть запущен в качестве основной программы:
if __name__ = "__main__":
pass
Это предотвращает что-нибудь случиться, если модуль импортируется.
Ответ в решении, который вы связали, является как питоническим, так и элегантным. –
Другой дублирующий вопрос: http://stackoverflow.com/questions/1590608/is-it-possible-to-forward-declare-a-function-in-python – 2rs2ts