Python Argparser делает аргумент взаимоисключающим - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь использовать argparse в моем проекте. И у меня есть два аргумента, которые я хотел бы взаимно исключить из других аргументов.

Код

parser = argparse.ArgumentParser(description='List keys in S3 bucket for prefix')
parser.add_argument('-b', '--bucket', help='S3 Bucket', required=True)

date_parser = parser.add_argument_group("for date")
date_parser.add_argument('-n', '--last_modified_min', default=None, type=valid_datetime, help='Filter s3 content by minimum last modified date')
date_parser.add_argument('-x', '--last_modified_max', default=None, type=valid_datetime, help='Filter s3 content by maximum last modified date')

time_parser = parser.add_argument_group("for time")
time_parser.add_argument("-m", '--modified_time', help="")
time_parser.add_argument("-t", '--modified_time_type', choices=("minutes", "hours", "days"), help="")

Как настроить так, чтобы пользователь мог вводить данные либо из группы time_parser, либо из группы date_parser, но не из обеих. То есть следующее должно быть недействительным. -x является частью date_parser.

python test.py -b aa -m 1 -t hour -x 2020-01-01 

Обновление:

Я придумал это. Тем не менее, это не выглядит элегантно.

    args = parser.parse_args()
    if bool(args.modified_time) ^ bool(args.modified_time_type):
        parser.error("--modified_time and --modified_time_type must be given togather")

    if (bool(args.modified_time) and bool(args.modified_time_type)) and (args.last_modified_min or args.last_modified_max):
        parser.error("--last_modified_min or --last_modified_max can't be given with --modified_time")

1 Ответ

0 голосов
/ 16 апреля 2020

Я пытался сделать это раньше и считаю, что это не поддерживается.

add_mutually_exclusive_group позволяет выбрать только один аргумент из группы, и если вы попытаетесь вложить их это просто выравнивает группу.

Вы можете использовать add_subparsers, чтобы выбрать, находитесь ли вы в режиме даты или времени, но это делает интерфейс скрипта довольно грубым.

Лучшее из известных мне решений - обработать logi c вручную сразу после parse_args и вызвать parser.error, если что-то не так.

...