如何在 python argparse 中解析一个参数中的多个值,例如 -v、-vv、-vvv

问题描述 投票:0回答:1

我有一个情况,当我需要添加到我的命令参数时,没有像这样的值:

# command -v or
# command -vv or
# command -vvv

我需要验证“-v”是否在 1 到 3 之间。 如果没有出现错误消息。

这是我添加的参数之一,它是可选的。

在添加参数期间,我找不到任何解决方案(例如 store_count 或其他操作)来执行此操作,例如:

parser.add_argument('-v', '--verbosity', action=<any action>, default=0, required=False)

我尝试创建自定义操作,例如:

import argparse
parser = argparse.ArgumentParser()
class CustomAction(argparse.Action):
    def __init__(self,
                 option_strings,
                 dest,
                 default=None,
                 required=False,
                 help=None):
        super(CustomAction, self).__init__(
            option_strings=option_strings,
            dest=dest,
            nargs=0,
            default=default,
            required=required,
            help=help)

    def __call__(self, parser, namespace, values, option_string=None):
        count = getattr(namespace, self.dest, None)
        if count is None:
            count = 0
        setattr(namespace, self.dest, count + 1)

parser.add_argument('-v', '--verbosity', action=CustomAction, default=0, required=False)
args = parser.parse_args()

尝试在

"-v"
函数中设置验证,如果
__call__
介于 1 和 3 之间,但变量
values
始终为空列表。

变量

values
计数正确,但在退出
__call__
功能后设置。

我可以在 parser.add_argument() 之外执行此操作,但我想让它更漂亮并避免混乱的代码。

你知道我怎样才能实现这个目标吗?

python argparse
1个回答
0
投票

也许你可以阅读这个文档。

我更喜欢这种方式

这是最简单的方法

python code.py -v [num]

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-v', '--verbosity', dest='verbosity', default=0, required=False, type=int, choices=[1,2,3])
args = parser.parse_args()
v = args.verbosity

但是用这种方式也是可以的

import argparse

parser = argparse.ArgumentParser()
levels = 3
for i in range(1, levels+1):
    parser.add_argument(f'-{"v"*i}', dest=f'v'*i, , default=False, required=False, action='store_true')
args = parser.parse_args()
v = 0
for (k, i) in args._get_kwargs():
    if k.replace('v', '') != '':
        pass
    if i == True:
        if v == 0:
            v = len(k)
        else:
            raise ValueError('Only one of them')
© www.soinside.com 2019 - 2024. All rights reserved.