Цель 'if __name__ == "__main__":'

Я пытаюсь понять код, который я нашел, который читает аргументы командной строки (прилагается ниже). Моя забота о том, какая цель линии "if __name__ == __main__"...

Почему я должен использовать эту строку вместо того, чтобы просто использовать следующую строку main(sys.argv[1:]), какую дополнительную поддержку она предоставляет?

import sys, getopt

def main(argv):
   inputfile = ''
   outputfile = ''
   try:
      opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="])
   except getopt.GetoptError:
      print 'test.py -i <inputfile> -o <outputfile>'
      sys.exit(2)
   for opt, arg in opts:
      if opt == '-h':
         print 'test.py -i <inputfile> -o <outputfile>'
         sys.exit()
      elif opt in ("-i", "--ifile"):
         inputfile = arg
      elif opt in ("-o", "--ofile"):
         outputfile = arg
   print 'Input file is "', inputfile
   print 'Output file is "', outputfile

if __name__ == "__main__":
   main(sys.argv[1:])

Ответ 1

Ну, представьте, что кто-то хочет использовать функции в вашем модуле в своей собственной программе. Они импортируют ваш модуль... и он начинает делать свое дело!

С if __name__ == "__main__" этого не происходит. Ваш модуль только "делает свою вещь", если он работает как основной модуль. В противном случае он ведет себя как библиотека. Он поощряет повторное использование кода, упрощая его.

(Как поясняет @Sheng, вы можете захотеть импортировать модуль в другой script самостоятельно для целей тестирования.)

Ответ 2

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

Ответ 3

Это идиоматический способ узнать, был ли модуль Python выполнен как script или импортирован из другого модуля. Вы войдете только в блок if __name__ == "__main__", если файл был выполнен как script (иначе он является основным модулем).

Ответ 4

Это предложение unit test.

Если вы используете этот script напрямую, он выполнит блок if. Таким образом, вы можете сделать здесь unit test. Но если вы импортируете этот файл в качестве модуля, вы не хотите, чтобы эта часть выполнялась.

Он похож на основную функцию в Java. В каждом классе Java вы можете иметь основную функцию для unit test. Но класс импортируется/используется как модуль, основная функция не будет выполнена.

Как правило, если вы используете этот script напрямую, он будет ромом в блоке if. В противном случае кто-то хотел бы использовать этот файл как библиотеку функции/класса, тестовый пример name, чтобы эти коды не беспокоили пользователей.