Python argparse тип и ограничения выбора с nargs> 1 - PullRequest
15 голосов
/ 24 декабря 2011

Название в значительной степени говорит само за себя. Если у меня есть nargs больше 1, могу ли я установить ограничения (например, выбор / тип) для отдельных проанализированных аргументов?

Это пример кода:

parser = argparse.ArgumentParser()
parser.add_argument('-c', '--credits', nargs=2,
    help='number of credits required for a subject')

Для аргумента -c мне нужно указать тему и сколько кредитов требуется. Предмет должен быть ограничен заранее определенным списком предметов, а количество необходимых кредитов должно быть плавающим.

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

Ответы [ 2 ]

19 голосов
/ 24 декабря 2011

Вы можете проверить его с помощью пользовательского действия :

import argparse
import collections


class ValidateCredits(argparse.Action):
    def __call__(self, parser, args, values, option_string=None):
        # print '{n} {v} {o}'.format(n=args, v=values, o=option_string)
        valid_subjects = ('foo', 'bar')
        subject, credits = values
        if subject not in valid_subjects:
            raise ValueError('invalid subject {s!r}'.format(s=subject))
        credits = float(credits)
        Credits = collections.namedtuple('Credits', 'subject required')
        setattr(args, self.dest, Credits(subject, credits))

parser = argparse.ArgumentParser()
parser.add_argument('-c', '--credits', nargs=2, action=ValidateCredits,
                    help='subject followed by number of credits required',
                    metavar=('SUBJECT', 'CREDITS')
                    )
args = parser.parse_args()
print(args)
print(args.credits.subject)
print(args.credits.required)

Например,

% test.py -c foo 2
Namespace(credits=Credits(subject='foo', required=2.0))
foo
2.0
% test.py -c baz 2
ValueError: invalid subject 'baz'
% test.py -c foo bar
ValueError: could not convert string to float: bar
0 голосов
/ 28 декабря 2011

Полагаю, вы можете попробовать это - в add_argument () вы можете указать ограниченный набор входных данных с параметром choice = 'xyz' или choice = [this, that], как описано здесь: http://docs.python.org/library/argparse.html#choices

parser = argparse.ArgumentParser()
parser.add_argument('-c', '--credits', choice='abcde', nargs=2, 
    help='number of credits required for a subject')
...