是否可以使用 argparse 来捕获任意一组可选参数?

Is it possible to use argparse to capture an arbitrary set of optional arguments?

是否可以使用 argparse 来捕获任意一组可选参数?

例如,应接受以下两项作为输入:

python script.py required_arg1 --var1 value1 --var2 value2 --var3 value3

python script.py required_arg1 --varA valueA --var2 value2 --varB valueB

先验我不知道指定接收哪些可选参数但会相应地处理它们。

可能吗?可能,但我不会推荐它。 argparse 不是解析此类输入的最佳工具,或者相反,从 argparse 的角度来看,这是一个糟糕的参数规范。

您是否考虑过 usage 行应该是什么样子?如何向您的用户解释这一点?

你如何直接从 sys.argv 解析这个工作?看来你可以集齐 3 个:

 prog = sys.argv[0]
 arg1 = sys.argv[1]
 keys = sys.argv[2::2]
 # maybe strip -- off each
 values = sys.argv[3::2]
 kvdict = {k:v for k, v in zip(keys, values)}

还有其他 SO 问题询问通用 key:value 对。像这样的东西:

 --args key1:value1 key2:value2

这可以通过 nargs='*' 和一个将每个输入字符串拆分为 :(或 =)并按 key.[=26 存储内容的操作来处理=]

您的要求最不适合 argparse 使用,因为它需要绕过将参数标志与 argv 中的字符串匹配的整个想法。它需要以某种方式关闭所有正常的 argparse 解析。

看来我几年前就提出过同样的建议

Parse non-pre-defined argument

或更早

Using argparse to parse arguments of form "arg= val"

这种方法有点老套,但效果很好:

检查,哪些参数没有添加并添加

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("foo")
parser.add_argument("-bar", type=int)
# parser can have any arguments, whatever you want!

parsed, unknown = parser.parse_known_args() # this is an 'internal' method
# which returns 'parsed', the same as what parse_args() would return
# and 'unknown', the remainder of that
# the difference to parse_args() is that it does not exit when it finds redundant arguments

for arg in unknown:
    if arg.startswith(("-", "--")):
        # you can pass any arguments to add_argument
        parser.add_argument(arg.split('=')[0], type=<your type>, ...)

args = parser.parse_args()

例如:

python3 arbitrary_parser.py ha -bar 12 -extra1 value1 -extra2 value2

那么结果就是

args = Namespace(bar=12, foo='ha', extra1='value1' extra2='value2')