2

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

foo = Foo(bar=args.bar)

不幸的是,我有一个限制,即如果设置了关键字参数,则不能是None. 现在,我需要检查是否args.bar已设置并采取相应措施:

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

这是笨拙的,并且不能扩展到更多的论点。我想要的是这样的:

foo = Foo(**args.__dict__)

但这仍然受到我最初的问题的影响,并且对于不是方法的关键字参数的键也不起作用__init__。有没有很好的方法来实现这些事情?

4

2 回答 2

3

你可以尝试这样的事情:

>>> 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 的一部分,因此可能会或可能不会在未来的版本/版本中可用。

于 2013-03-01T15:36:12.283 回答
3

我认为您可以使用vars()

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

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

于 2017-05-29T13:45:40.893 回答