标题基本概括了所有内容.如果我有大于1的nargs,有什么办法可以在解析的各个args上设置限制(例如选择/类型)吗?
这是一些示例代码:
parser = argparse.ArgumentParser()
parser.add_argument('-c', '--credits', nargs=2,
help='number of credits required for a subject')
Run Code Online (Sandbox Code Playgroud)
对于-c参数,我需要指定一个主题以及需要多少学分.主题应限于预定义的主题列表,所需的学分数应为浮点数.
我可以用subparser做到这一点,但因为它已经是子命令的一部分,所以我真的不想让事情变得更复杂.
unu*_*tbu 20
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)
Run Code Online (Sandbox Code Playgroud)
例如,
% 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
Run Code Online (Sandbox Code Playgroud)
旁注,因为在搜索“argparse nargs options”时会出现这个问题:
仅当 nargs 参数需要异构类型验证时才需要自定义操作,即索引 0 处的参数应该是与索引 1 处的参数(此处:float)等不同的类型(此处:主题的有限类型)等。
如果需要同质类型验证nargs,choices直接结合就足够了。例如:
parser.add_argument(
"--list-of-xs-or-ys",
nargs="*",
choices=["x", "y"],
)
Run Code Online (Sandbox Code Playgroud)
将允许类似的任何内容--list-of-xs-or-ys x y x y,但如果用户指定了除x或之外的任何内容,则会抱怨y。