2010-10-28 3 views
400

Можно создать дубликат:
What does if __name__== "__main__" do?Зачем использовать def 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) 

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

+2

См. Http://stackoverflow.com/questions/419163/what-does-if-name-main-do – gimel

+8

stackoverflow.com/questions/419163/what-does-if-name-main-do делает не отвечайте на весь вопрос. – Johnsyweb

+4

То, что предполагаемый дубликат не отвечает: функция main() (а не просто запись всего кода в блок «if __name__») полезна, поскольку она позволяет избежать случайного создания глобальных переменных, которые могут повлиять на другие функции. – slowdog

ответ

465

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

+121

Также стоит отметить, что наличие Функция 'main()' позволяет запускать этот код с помощью: 'import module; module.main() '. Если код был только в блоке 'if', его нельзя было запустить из другого места. – FogleBird

7

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

72

если содержание foo.py

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

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

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

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

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

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

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

+0

Хотя этот ответ менее проголосовали, чем некоторые другие, но объяснил это очень ясно. Я прочитал [этот ответ] (http://stackoverflow.com/a/419185/2455888), но вы хорошо объяснили. +1 – haccks

15

"What does if __name__==“__main__”: do?" был дан ответ.

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

+1

2 вопроса с тем же ответом не делают их дублирующими – bubakazouba

+3

@bubakazouba: Я согласен. Я не отмечал этот вопрос как дубликат. * Часть * этого вопроса имеет действительно хороший ответ, я не видел смысла дублировать ответ. Я ответил * на оставшийся вопрос. – Johnsyweb

183

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

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

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

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

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

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

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

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

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

Я сам обычно начинаю писать небольшие сценарии с отбрасыванием без какой-либо функции. Если сценарий становится достаточно большим, или если я чувствую, что всякий код внутри функции мне пригодится, то я реорганизую код и делаю это. Это также происходит, когда я пишу сценарии 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() 

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

+0

Одним из преимуществ вызова 'main' с' sys.argv' в качестве параметра, как показано здесь, является то, что этот подход хорошо работает с модулем 'argparse' (который, IMO, является * Right Way * для обработки аргументов командной строки) , Все, что вам нужно сделать по-другому, это передать 'argv'' parse_args' в 'main'. – jkt123

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