Цель '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:])
4 ответа
Хорошо, представьте, что кто-то еще хочет использовать функции вашего модуля в своей собственной программе. Они импортируют ваш модуль... и он начинает делать свое дело!
С if __name__ == "__main__"
этого не происходит. Ваш модуль только "делает свое дело", если он работает как основной модуль. В противном случае он ведет себя как библиотека. Это поощряет повторное использование кода, делая его проще.
(Как упоминает @Sheng, вы можете самостоятельно импортировать модуль в другой скрипт для тестирования).
Это для модульного тестирования предлагает.
Если вы запускаете этот скрипт напрямую, он выполнит if
блок. Таким образом, вы можете выполнить здесь некоторые тестовые работы. Но если вы импортируете этот файл как модуль, вы не хотите, чтобы эта часть выполнялась.
Это похоже на основную функцию в Java. В каждом Java-классе вы можете иметь основную функцию для модульного тестирования. Но класс импортируется / используется как модуль, основная функция не будет выполнена.
Как правило, если вы используете этот скрипт напрямую, он запустит if
блок. В противном случае кто-то хотел бы использовать этот файл в качестве библиотеки функций / классов, а имя тестового примера гарантирует, что этот код не будет беспокоить пользователей.
if __name__ == '__main__'
Соглашение в Python предназначено для того, чтобы позволить вам писать код, который можно запускать напрямую или импортировать.
Если вы импортируете это, то if
блок не выполняется. Если вы бежите python.exe myscript.py
это.
Это идиоматический способ узнать, был ли модуль Python выполнен в виде скрипта или импортирован из другого модуля. Вы будете входить только if __name__ == "__main__"
заблокировать, если файл был выполнен как скрипт (он же основной модуль).