Условный аргумент с опцией выбора - PullRequest
3 голосов
/ 09 апреля 2019

Ниже приведены три аргумента, которые я пишу в модуле.

parser.add_argument('--Type',type=str,choices=['a','b','c'],help='Options include: a,b,c.',required=True)

parser.add_argument('--Input',default=False,help='Generate input files',required=False)

parser.add_argument('--Directory',default=False,help='Secondary directory',required='--Input' in sys.argv)

--Type возможно с тремя вариантами: a, b, c.

В настоящее время он настроен так, что, если --Directory имеет значение true, для него требуется --Input, чтобы иметь значение true.

Однако я бы хотел добавить в условие --Directory дополнительное условие, требующее, чтобы --Type был == 'c'.

Как изменить обязательную опцию в аргументе --Directory, чтобы она требовала и --Input, и --Type == 'c'?

Ответы [ 4 ]

2 голосов
/ 09 апреля 2019

Разберите аргумент, разбирающий ваши требования.

parser.add_argument('--Type', choices=['a','b','c'], required=True)
parser.add_argument('--Input', action='store_true')
parser.add_argument('--Directory', action='store_true')

args = parser.parse_args()

if args.Directory and args.Type != 'c' and not args.input:
    raise argparse.ArgumentError("--Directory requires --Type c and --Input")

(Обратите внимание, что action='store_true' автоматически устанавливает type=bool и default=False.)

1 голос
/ 09 апреля 2019

Я бы не использовал параметр required ни для одной из этих вещей, он подвержен ошибкам и не очень читабелен. Просто проверьте правильность аргументов после разбора.

import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--Type', type=str, choices=['a','b','c'], help='Options include: a,b,c.', required=True)
    parser.add_argument('--Input', default=False, help='Generate input files', required=False)
    parser.add_argument('--Directory', default=False, help='Secondary directory', required=False)
    parsed_args = parser.parse_args()
    if parsed_args.Directory and not (parsed_args.Input and parsed_args.Type == 'c'):
        parser.error('option --Directory requires --Input and --Type c.')
0 голосов
/ 09 апреля 2019

Я думаю, что также возможно сделать что-то подобное

import sys

# Your past code here

args = parser.parse_args()

type = args.Type
input = args.Input
directory = args.Directory

if directory:
    if input != 'c':
        print 'error in argument'
        sys.exit(1)
0 голосов
/ 09 апреля 2019

Это не самый красивый, но вы можете посмотреть аргумент рядом с --Type и проверить, что он равен 'c' примерно так:

parser.add_argument('--Directory', default=False, help='secondary directory',
                    required=('--Type' in sys.argv and
                              sys.argv[sys.argv.index('--Type') + 1] == 'c')
                   )
...