有这样的东西:
>>> import argparse
>>> ap = argparse.ArgumentParser()
>>> ap.add_argument('-e', '--env', action='append', nargs=2, metavar=('NAME', 'VALUE'), dest='extra_env', help='set some env var to given value')
_AppendAction(option_strings=['-e', '--env'], dest='extra_env', nargs=2, const=None, default=None, type=None, choices=None, help='set some env var to given value', metavar=('NAME', 'VALUE'))
它有点作用:
>>> ap.parse_args(['-e', 'SOMEENVVAR', 'SOMEVAL', '--env', 'OTHERENVVAR', 'OTHERVAL'])
Namespace(extra_env=[['SOMEENVVAR', 'SOMEVAL'], ['OTHERENVVAR', 'OTHERVAL']])
但我想知道如何立即将其转换为字典?现在我必须在一些后处理中执行此操作:
>>> args = ap.parse_args(['-e', 'SOMEENVVAR', 'SOMEVAL', '--env', 'OTHERENVVAR', 'OTHERVAL'])
>>> dict(args.extra_env)
{'SOMEENVVAR': 'SOMEVAL', 'OTHERENVVAR': 'OTHERVAL'}
我想使用
type
参数来实现这一点,但似乎 action=append
和 nargs=2
的组合似乎打破了它;为 type
中的每个参数单独调用传递给 nargs
的函数:
>>> ap.add_argument('-e', '--env', action='append', nargs=2, metavar=('NAME', 'VALUE'), dest='extra_env', help='set some env var to given value', type=lambda x: print(f'called lambda for >{x}<'))
_AppendAction(option_strings=['-e', '--env'], dest='extra_env', nargs=2, const=None, default=None, type=<function <lambda> at 0x7f904df518c8>, choices=None, help='set some env var to given value', metavar=('NAME', 'VALUE'))
>>> ap.parse_known_args(['-e', 'SOMEENVVAR','SOMEVAL', '--env', 'OTHERENVVAR','OTHERVAL'])
called lambda for >SOMEENVVAR<
called lambda for >SOMEVAL<
called lambda for >OTHERENVVAR<
called lambda for >OTHERVAL<
(Namespace(extra_env=[[None, None], [None, None]]), [])
type
参数在应用操作之前传递给每个输入。相反,您可以传递一个自定义操作,该操作将从您的值对创建一个字典。
class DictAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
args_dict = getattr(namespace, self.dest, None) or {}
args_dict.update(dict([values]))
setattr(namespace, self.dest, args_dict)
ap.add_argument(
'-e', '--env',
action=DictAction,
nargs=2,
metavar=('NAME', 'VALUE'),
dest='extra_env',
type=lambda kv: {kv[0]: kv[1]},
help='set some env var to given value',
)
这是输出:
ap.parse_args(['-e', 'SOMEENVVAR', 'SOMEVAL', '--env', 'OTHERENVVAR', 'OTHERVAL'])
# returns:
Namespace(extra_env={'SOMEENVVAR': 'SOMEVAL', 'OTHERENVVAR': 'OTHERVAL'})