Функция main() в Python

Перевод статьи «Why doesn’t Python have a main function?».

Почему я не рекомендую использовать функцию main

Несомненно, в Python нет так называемой главной входной функции, однако в Интернете часто встречаются статьи, в которых упоминается «main-функция Python» и «предлагается написать функцию main«.

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

В этой статье мы поговорим о том, почему в Python нет функции main.

Прежде чем приступить к рассмотрению темы, давайте ответим на эти два вопроса:

  • Что означает так называемая «main-функция»?
  • Почему в некоторых языках программирования необходимо писать функцию main?

Некоторые языки программирования используют функцию main в качестве начала выполнения программы, например C/C++, C#, Java, Go, Rust и т.д. При этом:

  • Имя этой основной функции является обязательным, что означает, что должна существовать функция main.
  • В программе может быть не более одной функции main, что гарантирует уникальность входа в программу.
  • Формат грамматики имеет конкретные требования и относительно фиксированный шаблон.

Зачем нужно принудительно вводить функцию main?

В компилируемых языках код компилируется в исполняемые двоичные файлы. И чтобы операционная система/загрузчик могли найти начало программы, необходимо определить единственную «главную» функцию — main.

Проще говоря, в большой куче кода, который можно использовать для выполнения, есть некое начало, которое необходимо определить.

Нетрудно заметить, что функция main является существенной и неотъемлемой органической частью этих языков. Однако если мы обратимся к Python, то ситуация окажется совершенно иной.

  • Python является интерпретируемым языком, т.е. языком сценариев. Процесс выполнения идет сверху вниз, строка за строкой, то есть его начальная точка известна.
  • Каждый файл с расширением .py является исполняемым файлом, который может быть использован в качестве входного файла всей программы. Это подразумевает гибкость записи программы и отсутствие необходимости следовать каким-либо строгим правилам.
  • Иногда при запуске 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? Если возможно, вы можете разбить основную функцию, даже не оборачивая её в функцию!

Подведем итоги

  • Откажитесь от инерционного мышления и пишите аутентичный код. Функция main уникальна для некоторых языков, и ее не следует использовать в Python. Вы должны понимать особенности скриптового языка и писать в простом и элегантном стиле.
  • Используйте main.py вместо main(). Поскольку в Python единицей выполнения программы является файл сценария, а не функция или класс, рекомендуется называть файл входа main.py, а внутренние функции определять в соответствии с требованиями.
  • По возможности используйте main.py в качестве входного файла. Его удобно использовать в сочетании с параметром -m в командной строке.

Что вы чувствуете после прочтения этой статьи? Нравится ли вам использовать оператор if? Сообщите мне об этом в комментариях, указав причину 😊.