如何通过循环而不是手动为每个参数调用“add_argument”来初始化 argparser?

How to init argparser by looping instead of invoking `add_argument` for every argument manually?

使用 argparser 创建 CLI 时,一旦参数数量增加,代码就会开始大量重复。

可以从文档中的 example 看出:

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')

args = parser.parse_args()
print(args.accumulate(args.integers))

这是一个基本示例,以这种方式编写很好,但是可以看到 add_argument 调用的重复。您可能会假设,对于更复杂的 CLI,这很快就会成为一个问题。这里有一个real example.

有没有办法克服这个问题,使初始化更紧凑但仍可读? (请不要对替代 CLI 框架提出建议)

更新澄清

我们用不同的参数一个接一个地重复调用同一个函数。我的直觉是,可能有一种方法可以将这些参数分组到一个结构中,然后在包含上述结构的列表中使用星号/“双星号”运算符的组合执行 parser.add_argument

ArgumentParser.add_argument 有以下声明:

ArgumentParser.add_argument(single positional argument, lots of optional keyword arguments)

我正在寻找一种数据结构和星号运算符,它可以被解压到 single positional argument, lots of optional keyword arguments

首先,我不认为它违反了DRY。我们多次使用同一个函数,但我们不重复它的代码。

关于列表中整数求和的评论中你的问题是什么,你建议使用for循环并调用“add_to_sum”函数一次。但是有什么反对将其应用于“add_argument”的呢?

ARGS = (
    (('-x', '--crossbar'), {'type': str}),
    (('-c', '--config'), {'type': str})
)

parser = argparse.ArgumentParser()

for arg in ARGS:
    parser.add_argument(*arg[0], **arg[1])