2015-06-15 6 views
5

В таких языках, как C и C++, обычно определять вызываемые функции выше своих вызывающих абонентов, чтобы избежать необходимости в форвардных объявлениях. Например:Порядок функций в исходном файле Python

void g() { ... } 

void f() { g(); ... } 

int main() { f(); ... } 

В Python, если

if __name__ == '__main__': 
    main() 

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

Есть ли какое-либо соглашение о порядке выполнения функций в исходном файле Python? Вызываемые функции, которые все еще обычно записываются выше вызывающих, или наоборот?

Редактировать: Ответ заключается в том, что нет соглашения (например, в PEP 8 ничего нет) относительно порядка функций. Даже модули в стандартной библиотеке несовместимы.

+3

Порядок функций в python * does * matter. Вы не можете вызвать функцию до ее определения. В C и C++ вы должны объявить функцию до того, как вы ее вызовите, либо в том, как вы показываете, либо с использованием прототипа. Python не поддерживает прототипы. – cdarke

+0

Обычно это классы, затем функции, затем «голые» коды. – Zizouz212

+2

Я голосую, чтобы закрыть этот вопрос как не относящийся к теме, потому что на него прямо ответили в документации к продукту. – KevinDTimm

ответ

3

Для статически типизированных языков достаточно определить его определение, чтобы определить тип объекта. Однако, если определение появляется после его использования, потребуется два прохода: 1) определить типы таких объектов, 2) скомпилировать с использованием известного тогда типа. Если определение было в другом файле, это также должно быть проанализировано, прежде чем передать 2. Это обходен, требуя, чтобы объект/тип был , объявленный (сообщите компилятору, что он существует, и о его типе) до его использования. Этого достаточно для компиляции. Фактическое определение просто резервирует место для объекта и не требуется для генерации фактического кода (в основном) - для этого и предназначена декларация. (Помните: большинство таких языковых карт позволяют объединить их там, где это необходимо).

В Python, как динамически типизированный язык, объект (значение и тип) имя ссылки (!) Можно изменить в любое время до его фактического использования потокомуправления, так что это бесполезно, чтобы проверить его, прежде чем его фактическая Применение.

Рассмотрим следующий пример:

def f(): 
    g() 

def g(): 
    pass 

f() 

Это может выглядеть как если controverts "Определить первые" политики. Но на самом деле это не так, поскольку g() будет необходим только тогда, когда фактически выполняется f(). То есть не до последней строки (f()), в котором g() очень хорошо было определено.

+6

Трус - это тот, кто опускает голову, но не оставляет комментария. – Olaf

+1

Не иллюстратор, но я предполагаю, что некоторые люди сделали это потому, что ваш пост не затрагивал вопрос о согласии. Что касается этого вопроса, мне нравится организовывать определения функций, как в C, потому что, по моему опыту, это облегчает навигацию по коду. – MarkM

+1

@MarkM Я очень хорошо решу вопрос. OP запрашивает соглашение и (косвенно), почему он все еще работает без определения перед использованием. Я обращаюсь к обоим, так как нет конвенции, и я объясняю, почему нет необходимости (соответственно, что отличается). Если вы используете способ C (Pascal и т. Д.) (Так же как и я), это мнение, общее соглашение и неприемлемо для переполнения стека (прочитайте [ask]. Поэтому я концентрируюсь на фоне, а не на мнениях. – Olaf

Смежные вопросы