Ответ 1
Без главного часового кода код будет выполнен, даже если script был импортирован как модуль.
Возможный дубликат:
Что делает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)
Мне просто интересно, есть ли какая-нибудь рифма в основном?
Без главного часового кода код будет выполнен, даже если script был импортирован как модуль.
Все остальные уже ответили на него, но я думаю, что мне еще есть что добавить.
Причины того, что оператор 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()
Итак, не стесняйтесь писать код, который вам больше подходит.:)
если содержимое foo.py
print __name__
if __name__ == '__main__':
print 'XXXX'
Файл foo.py можно использовать двумя способами.
- импортируется в другой файл:
import foo
В этом случае __name__
есть foo
, секция кода не выполняется и не печатает XXXX
.
- выполняется непосредственно:
python foo.py
Когда он выполняется напрямую, __name__
совпадает с __main__
, и код в этом разделе выполняется и печатает XXXX
Одна из возможностей использования этой функции для записи различных типов модульных тестов в одном модуле.
"На что отвечает if __name__=="__main__":
do?".
Наличие функции main()
позволяет вам называть ее функциональность, если вы import
модуль. Основная (не предназначенная для каламбур) польза от этого (ИМХО) заключается в том, что вы можете unit test его.
Рассмотрим второй script. Если вы импортируете его в другой, инструкции, как на "глобальном уровне", будут выполнены.