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

Код "Boilerplate" в 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) Нужен ли этот код? Мне кажется, что код работает независимо от того, есть ли у него основной метод. Что делает использование этого кода лучше? Это еще лучше?

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

4) Это происходит на Python? Существуют ли другие примеры "шаблонного кода"?

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

4b9b3361

Ответ 1

  • Он повторяется в том смысле, что он повторяется для каждого script, который вы можете выполнить из командной строки.
  • Если вы поместите свой основной код в такую ​​функцию, вы можете импортировать модуль, не выполняя его. Иногда это полезно. Кроме того, это еще больше усугубляет ситуацию.
  • Как я могу сказать, как # 2
  • Python, как правило, неплохо избегает шаблона. Он достаточно гибкий, что в большинстве ситуаций вы можете написать код для создания шаблона, а не писать шаблонный код.

Не заданный вопрос:

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

Ответ 2

Причина, по которой блок if __name__ == "__main__": называется шаблоном в этом случае, заключается в том, что он реплицирует автоматическую функциональность на многих других языках. В Java или С++, среди многих других, при запуске вашего кода он будет искать метод 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 - одна строка.

Ответ 3

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

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

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

Ответ 4

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

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

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

4) его очень часто. doctest - еще один.

Поезд, чтобы стать гуру-питона... и удачи в тезисе!; -)

Ответ 5

Вам не нужно добавлять 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, если вы хотите поместить его на место.

Ответ 6

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

  • Python просматривает список и вносит модуль sys
  • Он находит функцию argv и запускает ее

Итак, что здесь происходит?

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

Теперь, что касается шаблона, есть две части:

  • сама программа (логика), определенная в main и
  • часть вызова, которая проверяет, существует ли main

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