如何通过循环而不是手动为每个参数调用“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])
使用 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])