2017-01-04 6 views
0

Я работаю с/переписывание кода, который первым определяет функцию следующим образом:Почему def main (argv = [__ name__]), а если __name__ == "__main__": sys.exit (main (sys.argv))?

def main(argv=[__name__]): 
    ... 
    *rest of code* 
    ... 

и заканчивается:

if __name__ == "__main__": 
    sys.exit(main(sys.argv)) 

Я нахожусь под впечатлением, что это делает это проверка чтобы убедиться, что сценарий выполняется из командной строки, а затем запускает функцию main с аргументами, предоставляемыми при выходе из python. Но почему, почему необходимо установить переменную argv на [__name__] в определении функции? Это не мой код, поэтому я не знаю первоначального намерения. Однако я новичок в использовании строк if __name__ == "__main__":, чтобы определить выполнение командной строки проверки, так что, возможно, есть некоторые очевидные причины для этого синтаксиса, который мне не хватает. Любая помощь или дальнейшая информация по main будет оценена в функции определения функции и тестирования аргументов/командной строки-vs-модуля.

+0

Нет ничего странного в отношении 'sys.exit()', и у нас уже есть (ответили!) Вопросы в нашей базе знаний о применяемых там практиках, сравнивая '__name__' с' __main__'. Пожалуйста, подумайте о том, чтобы сузить свой вопрос, чтобы не иметь дублирующего компонента; возможно, охватывая как предварительно ответы, так и не ответы на них, делает его «слишком широким». –

+0

... один пример среди многих: [Зачем использовать 'def main()'?] (Http://stackoverflow.com/questions/4041238/why-use-def-main) –

ответ

1

Определение main() допускает, что main() будет вызываться другими способами, чем линия sys.exit() внизу файла. Это может быть примером защитного программирования или может указывать на другие поддерживаемые виды использования этого файла.

Одним из таких других поддерживаемых использование может быть, чтобы вызвать его из другой программы на Python, например, так:

import your_module 
your_module.main() 
1

Что касается argv=[__name__], оригинальный DEV, вероятно, хотел, чтобы сохранить возможность запускать эту функцию не из (т. е. вызывается другим модулем) и предоставляется __name__, поскольку для некоторых функций он использует sys.argv[0].

Функция main не имеет ничего общего с python, только некоторые соглашения (производные от таких языков, как C). sys.exit(main(sys.argv)) вызовет функцию sys.exit с кодом выхода, эквивалентным произведению функции main с полученными аргументами командной строки. main, вероятно, должен возвращать соответствующий код выхода (0 - указать ОК, другие подразумевают различные исключения).

+0

Хммм ... Интересно. Исходный код не использует 'sys.arvg [0]' вообще или любой из элементов argv в функции 'main()'. Если эта функция была запущена как модуль, а не из командной строки, определяло бы такой аргумент, чтобы функция main() всегда использовала аргументы, специфичные в аргументе командной строки скрипта, который вызывает это как модуль? –

+0

Если функция не использует 'argv', то она не имеет смысла использовать ее в качестве параметра. В противном случае вы можете управлять основной функциональностью, отправив свои пользовательские параметры (или обеспечив их существование с помощью 'argv' по умолчанию) – Uriel

0

Когда сценарий запускается из CLI, argv[0] - это имя скрипта, а остальная часть argv - это аргументы командной строки. Таким образом, остальные main() можно ожидать, что argv[0] всегда будут заполнены.

Значение по умолчанию гарантирует, что argv[0] есть что-то аналогичное в нем, когда файл импортируется вместо того, чтобы работать непосредственно. В этом случае это имя модуля.

Смежные вопросы