Перевод статьи «Why doesn’t Python have a main function?».
Друзья, подписывайтесь на наш телеграм канал Pythonist. Там еще больше туториалов, задач и книг по Python.
Несомненно, в Python нет так называемой главной входной функции, однако в Интернете часто встречаются статьи, в которых упоминается «main-функция Python» и «предлагается написать функцию main«.
Возможно, их целью является имитация аутентичных основных функций, но многие заблуждаются (или неправильно понимают) и пишут очень громоздкий код.
В этой статье мы поговорим о том, почему в Python нет функции main.
Прежде чем приступить к рассмотрению темы, давайте ответим на эти два вопроса:
Некоторые языки программирования используют функцию main в качестве начала выполнения программы, например C/C++, C#, Java, Go, Rust и т.д. При этом:
В компилируемых языках код компилируется в исполняемые двоичные файлы. И чтобы операционная система/загрузчик могли найти начало программы, необходимо определить единственную «главную» функцию — main.
Проще говоря, в большой куче кода, который можно использовать для выполнения, есть некое начало, которое необходимо определить.
Нетрудно заметить, что функция main является существенной и неотъемлемой органической частью этих языков. Однако если мы обратимся к Python, то ситуация окажется совершенно иной.
python -m http.server 8000
«). Это может быть связано с наличием файла main.py
, он находится в пакете как «файл» для выполнения операций.От редакции Pythonist: у нас есть отдельные статьи о том, как создавать и запускать скрипты — «Создание Python-скрипта, выполняемого в Unix» и «Как запустить скрипт Python».
В заключение, это означает, что сценарный язык Python отличается от компилируемых языков. Вне зависимости от того, на уровне отдельного модуля (то есть файла .py) или на уровне пакета, состоящего из нескольких модулей, Python может выбирать гибкий метод выполнения, в отличие от других языков, которые не могут быть реализованы без четко определенной точки входа.
Другими словами, программисту, работающему на Python, не обязательно определять унифицированную запись (будь то функция, класс или что-то еще) на уровне синтаксиса.
Некоторых это может смутить, поскольку они часто видят или сами пишут следующий код:
# main file def main(): …… if __name__ == '__main__': main()
Разве это не функция main в Python? Думаю, многие из нас так считают!
Нет, это не так.
За исключением самого имени, эта функция не имеет ничего общего с ортодоксальной главной функцией, о которой мы говорили ранее. Она не является ни обязательной, ни обязательно определяющей порядок выполнения программы. Ее отсутствие не вызовет никаких грамматических проблем.
Эту функцию называют «main» только для того, чтобы подчеркнуть ее «главный» статус и искусственно расположить ее в качестве первой выполняемой функции.
Возможно, некоторые программисты считают, что такие именованные функции легче запомнить.
Причина, по которой пишут if __name__ == '__main__'
, может заключаться в том, что main()
запускается только при непосредственном выполнении текущего скрипта и не будет запускаться при импорте в другие модули.
Однако лично я не рекомендую использовать такой способ написания.
Самый явный пример: есть всего несколько десятков строк кода или просто файл сценария, реализующий простую функцию (небольшой веб-сканер, рисование картин с помощью turtle и так далее), но все они написаны в том же стиле, что и ранее.
Не рекомендуется писать if __name__ == '__main__'
по следующим причинам.
Во-первых, если имеется только один файл, то отсутствует возможность экспорта.
Во-вторых, если файлов несколько, то крайне не рекомендуется писать это предложение во входном файле (main.py). Теоретически его содержимое не должно экспортироваться для использования в других модулях, поскольку он является отправной точкой.
Наконец, не рекомендуется также записывать это условие в файлах, которые не являются точкой входа и состоят из нескольких файлов, поскольку в лучшем случае можно записать некоторые из этих тестовых кодов. Тем не менее, тестовый код следует выделять и записывать в отдельную директорию или файл.
Каждый раз, когда я вижу этот громоздкий код, мне становится не по себе. Зачем писать этот оператор if
? Если возможно, вы можете разбить основную функцию, даже не оборачивая её в функцию!
-m
в командной строке.Что вы чувствуете после прочтения этой статьи? Нравится ли вам использовать оператор if
? Сообщите мне об этом в комментариях, указав причину 😊.
Управление памятью - важный, но часто упускаемый из виду аспект программирования. При неправильном подходе оно…
Как возникает круговой импорт? Эта ошибка импорта обычно возникает, когда два или более модуля, зависящих…
Вы когда-нибудь оказывались в ситуации, когда скрипт на Python выполняется очень долго и вы задаетесь…
В этом руководстве мы разберем все, что нужно знать о символах перехода на новую строку…
Блок if __name__ == "__main__" в Python позволяет определить код, который будет выполняться только при…
Давайте разберем, как настроить модульные тесты для экземпляров классов. Мы напишем тесты для проверки функциональности…