是否可以使用 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')
是否可以使用 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')