Как задать необязательный аргумент для функции в python при получении значения с помощью sys.argv

#python #argv #optional-arguments

Вопрос:

Я пишу программу, чтобы принимать 3 аргумента от пользователей. Первые два аргумента являются целочисленными, а третий аргумент является строковым и необязательным.

Я знаю, что None используется в качестве значения по умолчанию null для необязательных аргументов, поэтому я попробовал следующее:

 def main(w, l, s=None):
    variable_1 = w
    variable_2 = l
    variable_3 = s
...
...

main(int(sys.argv[1]), int(sys.argv[2]), sys.argv[3])
 

Однако, если я поставлю третье значение не поставлено, произойдет следующая ошибка.

 IndexError: list index out of range
 

Я считаю, что это происходит потому, что проверка необязательного аргумента происходит позже, чем время, когда система обнаружила, что длина массива sys.argv недостаточно велика.
Итак, как я должен установить необязательный аргумент, используя None по умолчанию правильным образом в этом случае?
Спасибо, что прочитали мой вопрос.

Комментарии:

1. Это не проблема с созданной вами функцией. Это проблема с вашей вызывающей частью, в которой sys.argv нет 3-го индекса. Таким образом, возникло исключение.

Ответ №1:

Вы получаете IndexError: list index out of range , потому что он пытается взять третий аргумент из sys.argv . Но если вы не предоставите третий аргумент, он попытается передать третий аргумент функции, которой не существует. Чтобы исправить это, вы могли бы сделать что-то вроде этого-

 def main(w, l, s = None):
    variable_1 = w
    variable_2 = l
    variable_3 = s
...
...

if len(sys.argv) == 3:
    main(int(sys.argv[1]), int(sys.argv[2]), sys.argv[3])
else:
    main(int(sys.argv[1]), int(sys.argv[2]), None)
 

Это будет принимать аргумент только в том случае, если он существует, иначе он будет присвоен None variable_3 .

Ответ №2:

Вы должны принять возможность того, что третьего аргумента не приведено. Я бы сделал это, может быть, следующим образом:

 def main(argument):
    variable_1 = int(argument[0])
    variable_2 = int(argument[1])
    variable_3 = argument[2] if len(argument)>1 else None
...
...

main(sys.argv)
 

Комментарии:

1. Большое вам спасибо! Я понял тему, и теперь она хорошо работает!