使用argparse参数作为关键字参数

时间:2013-03-01 15:30:59

标签: python argparse

假设在使用argparse解析命令行后,我有一个args命名空间。现在,我想用它来创建这样的对象:

foo = Foo(bar=args.bar)

不幸的是,我有 if 设置关键字参数的限制,它不能是None。现在,我需要检查args.bar是否已设置并采取相应措施:

if args.bar:
    foo = Foo(bar=args.bar)
else:
    foo = Foo()

这是笨拙的,并不适用于更多参数。我想拥有的是这样的:

foo = Foo(**args.__dict__)

但是这仍然存在我的初始问题,并且对于不是__init__方法的关键字参数的键也不起作用。有没有一种很好的方法来实现这些目标?

2 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

>>> defined_args = {k:v for k,v in args._get_kwargs() if v is not None}
>>> foo = Foo(**defined_args)

例如:

>>> import argparse
>>> args = argparse.Namespace(key1=None,key2='value')
>>> {k:v for k,v in args._get_kwargs() if v is not None}
{'key2': 'value'}

但请注意,_get_kwargs()不是公共API的一部分,因此在将来的版本/版本中可能会或可能不会。

答案 1 :(得分:2)

我认为您可以使用vars()

args = parser.parse_args()
Foo(**vars(args))

vars([object])将命名空间作为字典返回