Код "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? Как он обрабатывает такие аргументы, если его не существует?
Ответы
Ответ 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
.