"Boilerplate" код в Python? - PullRequest
       21

"Boilerplate" код в Python?

31 голосов
/ 26 октября 2011

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

Ответы [ 6 ]

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

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

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

7 голосов
/ 26 октября 2011

Причина, по которой блок 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 - одна строка.

2 голосов
/ 17 июля 2014

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

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

print 1

и запустите его с $ python your_file.py

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

./print_one.py

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

2 голосов
/ 26 октября 2011

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

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

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

1 голос
/ 26 октября 2011

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

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

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

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

Тренируйтесь, чтобы стать гуру Python… и удачи в диссертации!; -)

0 голосов
/ 03 ноября 2011

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

  • Python просматривает список и выводит модуль sys
  • Он находит *Функция 1008 * и запускает ее

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

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

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

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

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

...