Зачем использовать def main()?

Возможный дубликат:
Что делает if __name__== "__main__"?

Я видел несколько примеров кода и учебники, которые используют

def main():
    # my code here

if __name__ == "__main__":
    main()

Но почему? Есть ли какая-то причина не определять ваши функции в верхней части файла, а затем просто писать код под ним? то есть

def my_function()
    # my code here

def my_function_two()
    # my code here

# some code
# call function
# print(something)

Мне просто интересно, есть ли какая-нибудь рифма в основном?

Ответ 1

Без главного часового кода код будет выполнен, даже если script был импортирован как модуль.

Ответ 2

Все остальные уже ответили на него, но я думаю, что мне еще есть что добавить.

Причины того, что оператор if вызывает main() (в определенном порядке):

  • Другие языки (например, C и Java) имеют функцию main(), которая вызывается при выполнении программы. Используя этот if, мы можем заставить Python вести себя как они, что кажется более знакомым для многих людей.

  • Код будет чище, легче читать и лучше организован. (да, я знаю, что это субъективно)

  • Это может быть import, что код python как модуль без неприятных побочных эффектов.

    • Это означает, что можно будет запускать тесты с этим кодом.

    • Это означает, что мы можем импортировать этот код в интерактивную оболочку python и тестировать/отлаживать/запускать его.

  • Переменные внутри def main являются локальными, а внешние - глобальными. Это может привести к нескольким ошибкам и неожиданному поведению.

Но вам не требуется писать функцию main() и вызывать ее внутри оператора if.

Я сам обычно начинаю писать небольшие сценарии раздачи без какой-либо функции. Если script становится достаточно большим, или если я чувствую, что всякий код внутри функции мне пригодится, то я реорганизую код и делаю это. Это также происходит, когда я пишу скрипты bash.

Даже если вы поместите код внутри основной функции, вам не нужно писать его точно так же. Оптимальным вариантом может быть:

import sys

def main(argv):
    # My code here
    pass

if __name__ == "__main__":
    main(sys.argv)

Это означает, что вы можете вызывать main() из других сценариев (или интерактивной оболочки), передавая пользовательские параметры. Это может быть полезно в модульных тестах или при пакетной обработке. Но помните, что в приведенном выше коде потребуется разбор argv, поэтому, возможно, было бы лучше использовать другой вызов, который уже обрабатывал бы параметры.

В объектно-ориентированном приложении, которое я написал, код выглядел следующим образом:

class MyApplication(something):
    # My code here

if __name__ == "__main__":
    app = MyApplication()
    app.run()

Итак, не стесняйтесь писать код, который вам больше подходит.:)

Ответ 3

если содержимое foo.py

print __name__
if __name__ == '__main__':
    print 'XXXX'

Файл foo.py можно использовать двумя способами.

  • импортируется в другой файл: import foo

В этом случае __name__ есть foo, секция кода не выполняется и не печатает XXXX.

  • выполняется непосредственно: python foo.py

Когда он выполняется напрямую, __name__ совпадает с __main__, и код в этом разделе выполняется и печатает XXXX

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

Ответ 4

"На что отвечает if __name__=="__main__": do?".

Наличие функции main() позволяет вам называть ее функциональность, если вы import модуль. Основная (не предназначенная для каламбур) польза от этого (ИМХО) заключается в том, что вы можете unit test его.

Ответ 5

Рассмотрим второй script. Если вы импортируете его в другой, инструкции, как на "глобальном уровне", будут выполнены.