Цель '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, чтобы эти коды не беспокоили пользователей.