#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. Большое вам спасибо! Я понял тему, и теперь она хорошо работает!