Должен ли main () присутствовать в каждом скрипте, содержащем обработчики? - PullRequest
2 голосов
/ 06 февраля 2011

Опытный Java-программист пытается освоить Python.У меня есть приложение в Google App Engine, и я хочу переместить обработчики администратора в отдельный файл.Так что теперь у меня есть main.py и admin.py.Я настроил app.yaml для правильной маршрутизации трафика и добавил вызов WSGIApplication () в каждом файле для маршрутизации в соответствующий обработчик.

Мой вопрос: нужен ли каждому файлу сценария def main () и соответствующий оператор if:

application = webapp.WSGIApplication([(r'/admin/(.*)', Admin)],
                                       debug=True)

def main():
    run_wsgi_app(application)

if __name__ == '__main__':
    main()

Ответы [ 2 ]

4 голосов
/ 07 февраля 2011

Это необходимо в любом скрипте, на который ссылается непосредственно ваш app.yaml.

Каждый раз, когда App Engine требуется отправить запрос к одному из ваших сценариев, он выполняет следующие шаги:

  1. Был ли скрипт импортирован раньше? Если нет, просто импортируйте его и остановите.
  2. Если скрипт был импортирован ранее, есть ли у него функция с именем main? Если нет, импортируйте его снова и остановите.
  3. Выполнить main функцию скрипта.

Причина, по которой это происходит, заключается в том, что импорт модулей является относительно дорогим, и нет смысла повторно импортировать их для каждого отдельного запроса. Таким образом, он обеспечивает оптимизацию: если вы предоставите функцию с именем main, при запросах после первого она просто выполнит эту функцию вместо повторного импорта сценария. Раздел if __name__ == "__main__": предназначен для обнаружения первого импорта скрипта и выполнения main вручную для этого первого запроса.

В двух словах, ответ заключается в том, что вы можете опустить как main, так и if, или включить их оба. Если вы их пропустите, ваше приложение будет несколько менее эффективным, но вы столкнетесь с проблемами только в том случае, если вы включите одно из двух, а не другое.

3 голосов
/ 06 февраля 2011

Это не обязательно: вы могли бы просто иметь:

if __name__ == '__main__':
    run_wsgi_app(application)

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

...