我是Python的初学者.

我想知道Argparse和JSON是否可以一起使用.

I could add them to argparse as -

parser.add_argument('-p','--param1',help='x variable', required=True)
parser.add_argument('-q','--param2',help='y variable', required=True)
parser.add_argument('-r','--param3',help='z variable', required=True)

现在假设我想从JSON文件中读取相同的变量,可以吗?

JSON输入文件-

{
    "testOwner": "my name",
    "tests": [
        "test1",
        "test2",
        "test3"
    ],

    "testParameters": {
        "test1": {
            "param1": "0",
            "param2": "20",
            "param3" : "True"
        },

        "test2": {
            "param1": "cc"
        }
    }   
}

推荐答案

The args Namespace from parse_args can be transformed into a dictionary with:

argparse_dict = vars(args)

JSON值也在字典中,比如json_dict.您可以将选定的值从一个字典复制到另一个字典,或进行整体更新:

argparse_dict.update(json_dict)

这样,json_dict个值会覆盖argparse值.

If you want to preserve both, you either need to have different argument (key) names, or the values have to be lists, which you can append or extend. That takes a bit more work, starting with using the correct nargs value in 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']}

I produced this by pasting your display into my Ipython session, but I think the JSON loader produces the same thing

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

Here I added it as a 3rd test set, taking (by conincidence) a name from the tests list. json_dict['testParameters']['test2']=args_dict would replace the values of test2.

One way to add the args values to the undefined values of 'test2' is:

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"值.

Json相关问答推荐

使用Jolt库对多个数组进行嵌套循环

使用更高级别架构中的字段值在$def内实现约束

在Golang中从 struct 手动创建JSON对象

织女星-没有循环的动画条形图第二部分(实际上是织女星)

来自json的可分析的构建报告

bash用jq获取第二条JSON记录

导致此 Kotlin Retrofit2 错误的可能原因有哪些?

如何将具有相同 struct 的多个JSON文件中的对象数组合并成一个数组?

Jolt 转换数组对象并将某些字段移动到嵌套数组

jq - 将父键值提取为子元素旁边的逗号分隔值

如何将从嵌套 Select 返回的空值转换为空数组?

使用 json_query 过滤嵌套列表中的元素

Jolt - 在同一级别添加时组合值的问题

Play Framework:如何序列化/反序列化与 JSON 的枚举

Java的JSON字符串整洁/格式化程序

Json.Net:用于自定义命名的 JsonSerializer-Attribute

如何自动修复无效的 JSON 字符串?

如何在 Java 中将 YAML 转换为 JSON?

运算符不存在:json = json

通过 JSON 发送 64 位值的公认方式是什么?