Должен ли я использовать метод main() в простом Python script?
У меня много простых скриптов, которые вычисляют некоторые вещи или около того. Они состоят всего из одного модуля.
Должен ли я писать основные методы для них и вызывать их с конструкцией if __name__
или просто сбрасывать все это прямо там?
В чем преимущества любого метода?
Ответы
Ответ 1
Хорошо, если вы это сделаете:
# your code
Затем import your_module
выполнит ваш код. Наоборот, с этим:
if __name__ == '__main__':
# your code
Импорт не будет запускать код, но таргетинг на интерпретатор в этом файле будет.
Если единственный способ запускать script - это открытие ручного интерпретатора, нет никакой разницы.
Это становится важным, когда у вас есть библиотека (или повторное использование определений в script).
-
Добавление кода в библиотеку вне определения или вне защиты if __name__
запускает код при импорте, позволяя вам инициализировать материал, который требуется библиотеке.
-
Возможно, вы хотите, чтобы ваша библиотека также имела некоторые функциональные возможности. Может быть, тестирование или, может быть, что-то вроде Python SimpleHTTPServer (он поставляется с некоторыми классами, но вы также можете запустить модуль, и он запустит сервер). Вы можете иметь это двойное поведение с предложением if __name__
.
-
Инструменты, такие как epydoc
импортируют модуль для доступа к docstrings, поэтому запуск кода, когда вы просто хотите генерировать HTML-документацию, на самом деле не является целью.
Ответ 2
Я всегда пишу функцию main()
(соответствующим образом названную) и не помещаю ничего, кроме синтаксического анализа командной строки, и вызов main()
в блоке if __name__ == '__main__'
. Это потому, что независимо от того, насколько глупый, тривиальный или одноцелевой я изначально ожидал, что script будет, я всегда получаю желание вызвать его из другого модуля в более позднюю дату.
Либо я трачу время, чтобы сделать его импортным модулем сегодня, либо потратить дополнительное время, чтобы реорганизовать его несколько месяцев спустя, когда я хочу его повторно использовать для чего-то еще.
Всегда.
Каждый раз.
Я прекратил бороться с ним и начал писать код с этим ожиданием с самого начала.
Ответ 3
Другие ответы хороши, но я хотел добавить пример того, почему вы, возможно, захотите его импортировать: модульное тестирование. Если у вас есть несколько функций, а затем if __name__=="__main__":
, вы можете импортировать модуль для модульного тестирования. Возможно, вам лучше, чем мне, но я обнаружил, что мои "простые сценарии, которые не могут иметь никаких ошибок", как правило, имеют ошибки, которые я нахожу при модульном тестировании.
Ответ 4
Конструкция if __name__
позволит вам легко повторно использовать функции и классы в модуле в других сценариях Python. Если вы этого не сделаете, тогда все в модуле будет работать, когда оно import
ed.
Если в script нет ничего, что вы хотите повторно использовать, то обязательно, просто выкиньте все это там. Иногда я это делаю. Если вы позже решите, что хотите повторно использовать какой-то код, я нашел Python как простой язык, на котором можно было бы перекомпоновковать код, не нарушая его.