Using argparse arguments as keyword arguments

送分小仙女□ 提交于 2019-12-11 02:54:03

问题


Let's say I have an args namespace after parsing my command line with argparse. Now, I want to use this to create some objects like this:

foo = Foo(bar=args.bar)

Unfortunately, I have the restriction that if a keyword argument is set, it must not be None. Now, I need to check if args.bar is set and act accordingly:

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

This is unwieldy and doesn't scale for more arguments. What I'd like to have, is something like this:

foo = Foo(**args.__dict__)

but this still suffers from my initial problem and additionally doesn't work for keys that are not keyword arguments of the __init__ method. Is there a good way to achieve these things?


回答1:


You could try something like this:

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

For example:

>>> 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'}

Note, however, that _get_kwargs() is not part of the public API so may or may not be available in future releases/versions.




回答2:


I think you can use vars():

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

vars([object]) returns the namespace as a dictionary



来源:https://stackoverflow.com/questions/15161269/using-argparse-arguments-as-keyword-arguments

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!