nargs>1的Python argparse类型和选择限制

2024-05-19 19:29:07 发布

您现在位置:Python中文网/ 问答频道 /正文

书名很能说明一切。如果nargs大于1,是否可以对解析的单个参数设置限制(例如choice/type)?

下面是一些示例代码:

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

对于-c参数,我需要指定一个主题以及需要多少学分。科目应限于预先定义的科目列表,所需学分应为浮动数。

我也许可以用一个次级纵队来做,但因为这已经是次级指挥部的一部分了,所以我不想让事情变得更复杂。


Tags: 代码addparser示例typeargparseargument学分
2条回答

你可以用custom action:来验证它

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

我想您可以在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')

相关问题 更多 >