将关键字参数传递给 argparse 保留默认值
Pass keyword arguments to argparse preserving defaults
假设您有一个如下所示的参数解析器,其通常的工作流程通过 parser.parse_args()
.
解析 CLI 参数
from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument("-arg1")
parser.add_argument("-arg2", default="some default value")
然而,我也可能想绕过参数解析并直接通过字典提供参数,它可能不包含可选参数。所有缺少的参数都应由解析器默认值提供。
即,理想的场景:
mydict={"arg1": "Supplied value"} # only supplied non-optional args
args = somehow_resolve_this(parser, mydict)
# this should now work
args.arg1
# Supplied value
print(args.arg2)
# Some default value
一个等效的问题是:如何从解析器获取所有可选参数名称和默认值?
您可以将 dict
转换为 argparse.Namespace
,然后将其输入 .parse_args
,如下所示
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-arg1")
parser.add_argument("-arg2", default="some default value")
namespace = argparse.Namespace(**{"arg1":"value"})
parsed = parser.parse_args(namespace=namespace)
print(parsed.arg1) # value
print(parsed.arg2) # some default value
解释:使用解包 **
将 dict
转换为 argparse.Namespace
的 kwargs,然后将其输入 parser.parse_args
只要 none 个参数是必需的(位置的或标记的),我们就可以获得默认值:
In [3]: args = parser.parse_args([])
In [4]: args
Out[4]: Namespace(arg1=None, arg2='some default value')
In [5]: vars(args)
Out[5]: {'arg1': None, 'arg2': 'some default value'}
我们可以'update'用你的命令:
In [6]: mydict = {"arg1": "Supplied value"}
In [7]: vars(args).update(mydict)
In [8]: args
Out[8]: Namespace(arg1='Supplied value', arg2='some default value')
使用创建命名空间并将其传递给解析器的想法:
In [17]: ns = argparse.Namespace(**mydict)
In [18]: ns
Out[18]: Namespace(arg1='Supplied value')
In [19]: parser.parse_args([], namespace=ns)
Out[19]: Namespace(arg1='Supplied value', arg2='some default value')
这里我提供了[]
argv
。如果您仍想阅读用户输入,则可以省略。使用 namespace
参数实际上 sets/replaces 所有默认值。 (不过,如果您使用的是子解析器,这可能会失败)。
如果需要参数怎么办?默认值与必需的参数无关。
获取默认值的另一种方法是从 actions
列表中提取它们:
In [20]: parser._actions
Out[20]:
[_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None),
_StoreAction(option_strings=['-arg1'], dest='arg1', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None),
_StoreAction(option_strings=['-arg2'], dest='arg2', nargs=None, const=None, default='some default value', type=None, choices=None, help=None, metavar=None)]
In [21]: {a.dest: a.default for a in parser._actions}
Out[21]: {'help': '==SUPPRESS==', 'arg1': None, 'arg2': 'some default value'}
假设您有一个如下所示的参数解析器,其通常的工作流程通过 parser.parse_args()
.
from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument("-arg1")
parser.add_argument("-arg2", default="some default value")
然而,我也可能想绕过参数解析并直接通过字典提供参数,它可能不包含可选参数。所有缺少的参数都应由解析器默认值提供。 即,理想的场景:
mydict={"arg1": "Supplied value"} # only supplied non-optional args
args = somehow_resolve_this(parser, mydict)
# this should now work
args.arg1
# Supplied value
print(args.arg2)
# Some default value
一个等效的问题是:如何从解析器获取所有可选参数名称和默认值?
您可以将 dict
转换为 argparse.Namespace
,然后将其输入 .parse_args
,如下所示
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-arg1")
parser.add_argument("-arg2", default="some default value")
namespace = argparse.Namespace(**{"arg1":"value"})
parsed = parser.parse_args(namespace=namespace)
print(parsed.arg1) # value
print(parsed.arg2) # some default value
解释:使用解包 **
将 dict
转换为 argparse.Namespace
的 kwargs,然后将其输入 parser.parse_args
只要 none 个参数是必需的(位置的或标记的),我们就可以获得默认值:
In [3]: args = parser.parse_args([])
In [4]: args
Out[4]: Namespace(arg1=None, arg2='some default value')
In [5]: vars(args)
Out[5]: {'arg1': None, 'arg2': 'some default value'}
我们可以'update'用你的命令:
In [6]: mydict = {"arg1": "Supplied value"}
In [7]: vars(args).update(mydict)
In [8]: args
Out[8]: Namespace(arg1='Supplied value', arg2='some default value')
使用创建命名空间并将其传递给解析器的想法:
In [17]: ns = argparse.Namespace(**mydict)
In [18]: ns
Out[18]: Namespace(arg1='Supplied value')
In [19]: parser.parse_args([], namespace=ns)
Out[19]: Namespace(arg1='Supplied value', arg2='some default value')
这里我提供了[]
argv
。如果您仍想阅读用户输入,则可以省略。使用 namespace
参数实际上 sets/replaces 所有默认值。 (不过,如果您使用的是子解析器,这可能会失败)。
如果需要参数怎么办?默认值与必需的参数无关。
获取默认值的另一种方法是从 actions
列表中提取它们:
In [20]: parser._actions
Out[20]:
[_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None),
_StoreAction(option_strings=['-arg1'], dest='arg1', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None),
_StoreAction(option_strings=['-arg2'], dest='arg2', nargs=None, const=None, default='some default value', type=None, choices=None, help=None, metavar=None)]
In [21]: {a.dest: a.default for a in parser._actions}
Out[21]: {'help': '==SUPPRESS==', 'arg1': None, 'arg2': 'some default value'}