如何转换为字典进行追加操作?

问题描述 投票:0回答:1

有这样的东西:

>>> 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]]), [])
python argparse
1个回答
0
投票

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'})
© www.soinside.com 2019 - 2024. All rights reserved.