Подтвердить что ты не робот

Я не понимаю главный блок Python. Что это такое?

Возможный дубликат:
Что такое < if __name __ == "__ main __" : > сделать?

Итак, я запускаю pyscripter, и я получаю файл с этим в нем:

def main():
    pass

if __name__ == '__main__':
    main()

Что это? Почему моя программа работает без него? Какая цель для этого? Куда мой код пойдет? Давайте скажем функцию, которая печатает мир привет. Где это будет? где я бы назвал это?

4b9b3361

Ответ 1

Цель в основном состоит в том, что вы можете определить центральную точку входа, если и только если script непосредственно запускается самостоятельно. Поскольку __name__ будет только когда-либо равным '__main__', если он запускается сам по себе. Помещение фактического содержимого script в отдельную функцию позволяет другим скриптам импортировать указанную функцию и запускать ее, когда захочет, поэтому она не запускается сразу же после импорта script.

Это также часто используется в libary-модулях, чтобы иметь какое-то поведение по умолчанию, когда вам просто нужно что-то быстро. Например, модуль http.server предлагает широкие функциональные возможности для создания собственного HTTP-сервера с любыми функциями, которые вы можете себе представить. Если вы просто хотите, чтобы простой сервер прослушивал и передавал файлы статически, вы можете просто использовать поведение по умолчанию модулей при запуске из командной строки.

Запуск python3 -m http.server в командной строке будет именно таким; запустите модуль http.server, который сам запустит простой HTTP-сервер в своем блоке __name__ == '__main__.

В ответ на ваш комментарий:

Для нормальных модулей, которые действуют как библиотеки, содержат типы или функции, для вашего приложения вам не нужна функция main или основной блок. Для сценариев, которые вызываются напрямую, например, ваш стартовый script, который фактически запускает ваше приложение, у вас будет какой-то код, который не инкапсулирован в функции или классы, а работает напрямую. Это было бы чем-то, вы могли бы включить основную функцию, которую вы затем вызываете отдельно. Это дает вам немного больше возможностей для размещения этого кода. Например, вы можете иметь функцию main непосредственно в начале файла, в то время как дополнительные функции, вызываемые внутри нее, дополнительно определяются в файл. И последняя часть script - это main(). Вам не обязательно вставлять это в условие if __main__ == '__main__':, вы можете просто вызвать его напрямую. Например, ваш script может выглядеть так:

def main ():
    # doing something
    utilityFunction(...)
    otherUtilityFunction(...)

def utilityFunction (...):
    ...
def otherUtilityFunction (...):
    ...

main()

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

Теперь, как я уже сказал, вам не нужно вставлять это в блок основного состояния; вы можете просто вызвать его напрямую. Однако, если по какой-либо причине вам когда-либо понадобится включить этот файл, например, потому что вы хотите инкапсулировать его в какую-либо другую вещь или хотите вызывать его повторно из интерактивной оболочки (IDLE или что-то еще), вы, вероятно, не хотите запускайте main() всякий раз, когда вы просто импортируете модуль, но только тогда, когда вы хотите фактически выполнить его функциональные возможности. Вот где вы должны положить main() в условие; таким образом, он не будет выполнен, если вы непосредственно выполняете модуль.

В общем, неплохая идея всегда ставить вызов main() в такое состояние, так как оно никогда не повредит, но часто станет полезным в какой-то более поздней точке.

Ответ 2

В __name__ global устанавливается значение __main__ при выполнении файла python, в то время как при импорте файла он имеет имя.

Эта конструкция позволяет выполнять некоторый код только в том случае, если файл выполнен. Например, если у вас есть файл mymain.py:

def main():
    print('Hello, World!')


if __name__ == '__main__':
    main()

Вы получаете следующие результаты:

$ python mymain.py
Hello, World!
$ python
Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mymain    # main() *not* executed
>>> mymain.main()
Hello, World!

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

Таким образом, это не обязательно, но это хорошая практика, чтобы использовать его. Часто вы поймете, что некоторые функции/классы программы могут быть полезны другой программе, поэтому возможность импортировать файл без выполнения основной программы является хорошей практикой.

Сравнение с Java, имеющим блок if __name__ == '__main__':, похоже на наличие класса, который имеет только метод main и использует другие классы для выполнения своей работы, в то время как его не используют, это похоже на метод main внутри класса, также предоставляют другие функции (например, какой-либо Контейнер или что-то еще с помощью метода main, который выполняет основную программу).

Ответ 3

Все в Python - это утверждение, нет такой вещи, как объявление (например, def - это оператор, создающий объект функции и привязывающий его к имени). Импорт модуля означает (после некоторой бухгалтерской работы) выполнение операторов в модуле. Аналогично, выполнение файла Python означает его импорт в качестве модуля. Следовательно, работает только написание программы как инструкций уровня модуля.

Но, конечно, это невозможно использовать повторно. Когда "программа" также должна быть импортируемой для других модулей, вы помещаете ее в функцию (и есть еще несколько других, незначительных преимуществ). Но тогда выполнение файла (python file.py) не будет делать ничего, кроме определения этой функции.

Введите __name__, который является именем модуля и равен '__main__' для модуля "точка входа". Таким образом, условие проверяет, был ли модуль импортирован или запущен как script, и выполняет его работу в последнем случае.

Ответ 4

Вам действительно не нужен этот трюк для "Hello world", но он полезен, если вы пишете модуль. Предложение if __name__ == '__main__' запустило бы main() только в том случае, если script выполняется напрямую, а не при использовании в качестве импорта из другого script.

Ответ 5

Идея довольно проста: вы можете использовать файл как в виде пакета (что-то импортировать где-то), либо как чистый script. Если файл используется как script, переменная интерпретатора Python "__name__" содержит "__main__" вместо имени пакета.

Итак, мы проверяем, установлен ли __name__ на __main__, что означает, что мы находимся в режиме script, и если да, мы выполняем код в блоке "if".

Вам нужно понять существенное различие между Java и Python: в Python, когда интерпретатор читает файл, он выполняется → как декларация, так и код интерпретируются, и многие функции Python основаны на этом.