The args
命名空间来自parse_args
可以将其转换为字典:
argparse_dict = vars(args)
JSON 值也在字典中,例如json_dict
。您可以将选定的值从一个字典复制到另一个字典,或进行整体更新:
argparse_dict.update(json_dict)
这样一来json_dict
值覆盖 argparse 的值。
如果您想保留两者,则需要具有不同的参数(键)名称,或者值必须是列表,您可以附加或扩展列表。这需要更多的工作,从使用正确的方法开始nargs
值在argparse
.
修订后的parser
产生,带有测试输入:
In [292]: args=parser.parse_args('-p one -q two -r three'.split())
In [293]: args
Out[293]: Namespace(param1='one', param2='two', param3='three')
In [295]: args_dict = vars(args)
In [296]: args_dict
Out[296]: {'param1': 'one', 'param2': 'two', 'param3': 'three'}
解析时的 JSON 字符串 (json.loads
?)产生一个像这样的字典:
In [317]: json_dict
Out[317]:
{'testOwner': 'my name',
'testParameters': {'test1': {'param1': '0', 'param2': '20', 'param3': 'True'},
'test2': {'param1': 'cc'}},
'tests': ['test1', 'test2', 'test3']}
我通过将您的显示粘贴到我的 Ipython 会话中来生成此内容,但我认为 JSON 加载器会生成相同的内容
argparse 值可以添加:
In [318]: json_dict['testParameters']['test3']=args_dict
In [319]: json_dict
Out[319]:
{'testOwner': 'my name',
'testParameters': {'test1': {'param1': '0', 'param2': '20', 'param3': 'True'},
'test2': {'param1': 'cc'},
'test3': {'param1': 'one', 'param2': 'two', 'param3': 'three'}},
'tests': ['test1', 'test2', 'test3']}
在这里我将其添加为第三个test
设置,(巧合地)从tests
list. json_dict['testParameters']['test2']=args_dict
将替换的值test2
.
将 args 值添加到“test2”的未定义值的一种方法是:
In [320]: args_dict1=args_dict.copy()
In [322]: args_dict1.update(json_dict['testParameters']['test2'])
In [324]: json_dict['testParameters']['test2']=args_dict1
In [325]: json_dict
Out[325]:
{'testOwner': 'my name',
'testParameters': {'test1': {'param1': '0', 'param2': '20', 'param3': 'True'},
'test2': {'param1': 'cc', 'param2': 'two', 'param3': 'three'},
'test3': {'param1': 'one', 'param2': 'two', 'param3': 'three'}},
'tests': ['test1', 'test2', 'test3']}
我用的是这个版本的update
优先考虑 JSON 字典中的 'cc' 值。