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

标签 python argparse

标题几乎说明了一切。如果我的 nargs 大于 1,有什么方法可以对解析的单个 args 设置限制(例如选择/类型)?

这是一些示例代码:

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

对于 -c 参数,我需要指定一个主题以及需要多少学分。主题应限于预定义的主题列表,并且所需的学分数量应该是 float 的。

我可能可以使用子解析器来完成此操作,但实际上这已经是子命令的一部分,所以我真的不希望事情变得更复杂。

最佳答案

您可以使用 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

关于nargs > 1 的 Python argparse 类型和选择限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8624034/

相关文章:

带有 1 或 3 个位置参数的 python 脚本

python - 完全删除重复数据而不维护重复数据

python - 如何在 Windows 10 控制台中使用对 ANSI 转义序列的新支持?

Python - 将 HTML 转换为 csv

python - 如何调试此错误 'float' 对象不可迭代?

Python3 Argparse 尝试读取文件并计算字母

python 使用argparse获取位置参数的长度

python - 如何使用 python argparse 解析可选参数?

machine-learning - Pytorch 使用 argprse 传递架构类型

python - 增强 is_valid() 但有异常