Необязательные аргументы в Argparse

#python #exception #command-line-arguments #argparse #optional-arguments

#python #исключение #аргументы командной строки #argparse #необязательно-аргументы

Вопрос:

Как я могу сгенерировать сообщение об ошибке, если при использовании argparse в коде в командной строке передается меньше необязательных аргументов, чем требуется? например, у меня есть 5 необязательных аргументов, и я хочу сгенерировать сообщение об ошибке, если одновременно используется менее 4 необязательных аргументов. Мой начинающий мозг не может этого понять.

 import argparse
import math
parser = argparse.ArgumentParser(description='Loan Calculator')
parser.add_argument('--type', type=str)
parser.add_argument('--principal', type=int)
parser.add_argument('--periods', type=int)
parser.add_argument('--interest', type=float)
parser.add_argument('--payment', type=int)
args = parser.parse_args()
  

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

1. Вам нужно как минимум четыре, но там не имеет значения, какие четыре из пяти вы получите? Я не уверен, что для этого есть поддержка (кажется невозможным правильно отображать в стандартном формате использования командной строки, не делая его безумно подробным, указывая каждую допустимую комбинацию 4 ). Я думаю, вы застряли в тестировании вручную, возможно, используя argparse средства печати справки , чтобы помочь с созданием сообщения об использовании.

2. Не имеет значения, какие четыре. если в командной строке передано менее четырех аргументов, должно отображаться «Неправильные параметры». У меня была идея указать все возможные комбинации, но я подумал, что может быть более простой способ.

3. if len([k for k,v in args.__dict__.items() if v is not None]) < 4:

Ответ №1:

Это то, что наиболее просто обрабатывается после вызова parse_args . Подсчитайте, сколько параметров по-прежнему имеют значение по умолчанию None . Если их больше 1, возникает ошибка.

 args = parser.parse_args()
if 1 < sum(1 for x in [args.type, args.principal, args.periods, args.interest, args.payment] if x is None):
    sys.exit("Too few options specified")