"Шаблонный" код на Python?

Google имеет учебник Python, и они описывают шаблонный код как "неудачный" и приводят следующий пример:

#!/usr/bin/python

# import modules used here -- sys is a very standard one
import sys

# Gather our code in a main() function
def main():
  print 'Hello there', sys.argv[1]
  # Command line args are in sys.argv[1], sys.argv[2] ..
  # sys.argv[0] is the script name itself and can be ignored

# Standard boilerplate to call the main() function to begin
# the program.
if __name__ == '__main__':
  main()

Теперь я слышал, что шаблонный код описывается как "казалось бы повторяющийся код, который появляется снова и снова, чтобы получить какой-то результат, который кажется, что он должен быть намного проще" (пример).

В любом случае, в Python часть, рассматриваемая как" шаблонный " код примера выше, была:

if __name__ == '__main__':
  main()

Теперь, мой вопросы следующие:

1) имеет ли шаблонный код в Python (как в приведенном примере) то же определение, что и определение, которое я предоставил? Если так, то почему?

2) этот код еще надо? Мне кажется, что код выполняется ли метод main. Что делает использование этого кода лучше? Еще лучше?

3) Почему мы используем этот код и какие услуги оно предоставляет?

4) это происходит во всем Python? Быть там другие примеры "шаблонного кода"?

О, и просто вне темы вопрос: вам нужно import sys использовать аргументы командной строки в Python? Как он обрабатывает такие аргументы, если его нет?

6 ответов


  1. он повторяется в том смысле, что он повторяется для каждого скрипта, который вы можете выполнить из командной строки.
  2. Если вы поместите свой основной код в такую функцию, вы можете импортировать модуль без его выполнения. Это иногда полезно. Это также держит вещи организованными немного больше.
  3. то же, что и #2, Насколько я могу судить
  4. Python, как правило, довольно хорошо избегает шаблона. Это достаточно гибко, что в большинстве ситуаций вы можете написать код для создания шаблона, а не для написания кода шаблона.

не по теме вопрос:

если вы не напишите код для проверки аргументов, они игнорируются.


причина в том, что if __name__ == "__main__": блок называется шаблоном, в этом случае он реплицирует функциональность, которая является автоматической на многих других языках. В Java или c++, среди многих других, при запуске кода он будет искать main() метод и запустить его, и даже жаловаться, если его там нет. Python запускает любой код в вашем файле, поэтому вам нужно сказать ему запустить main() метод; простой альтернативой было бы сделать запуск main() метод по умолчанию функциональность.

и if __name__ == "__main__": общий шаблон, который может быть короче. Нет причин, по которым вы не могли бы сделать что-то другое, например:

if __name__ == "__main__":
  print "Hello, Stack Overflow!"

  for i in range(3):
    print i

  exit(0)

это будет работать просто отлично; хотя мой пример немного глупо, вы можете видеть, что вы можете поместить все, что вам нравится. Дизайнеры Python выбрали это поведение вместо автоматического запуска main() метод (который вполне может не существовать), предположительно потому, что Python является" скриптовым " языком; поэтому вы можете написать некоторые команды непосредственно в файл, запустите его, и ваши команды выполняются. Я лично предпочитаю путь Python, потому что это облегчает запуск в Python для начинающих, и всегда приятно иметь язык, где Hello World-одна строка.


причина, по которой вы используете проверку "if main", заключается в том, что вы можете иметь модуль, который запускает некоторую часть своего кода на верхнем уровне (для создания вещей – констант, функций или классов – он экспортирует), а некоторую часть только при выполнении в качестве скрипта (например, модульные тесты для его функциональности).

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

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


1) главный шаблон является общим, но не может быть проще

2) main() не вызывается без шаблона

3) шаблон позволяет использовать модуль как в качестве автономного скрипта,и как библиотека в других программах

4) это очень распространено. doctest еще один.

поезд, чтобы стать гуру Python...и удачи с диссертацией! ;-)


вам не нужно добавлять if __name__ == '__main__' для одноразовых сценариев, которые не предназначены для участия в более крупном проекте. См.здесь для большого объяснения. Вам это нужно, только если вы хотите запустить файл самостоятельно и включить его в качестве модуля вместе с другими файлами python.

если вы просто хотите запустить один файл, вы можете иметь ноль шаблонный:

print 1

здесь $ python your_file.py

добавление строки shebang #!/usr/bin/python и работает chmod +x print_one.py получает возможность работать с

./print_one.py

наконец, # coding: utf-8 позволяет добавлять unicode в файл, если вы хотите поместить ❤ ' s повсюду.


давайте посмотрим, что произошло, когда вы позвонили import sys:

  • Python смотрит на список и приносит sys модуль
  • находит

вы по существу пишете свою программу под main, используя все функции, которые вы определили как раз перед определением main (или в другом месте), и пусть Python ищет main.