代码之家  ›  专栏  ›  技术社区  ›  Chweng Mega

如何在子级上标记python dict父级fail或pass base

  •  0
  • Chweng Mega  · 技术社区  · 6 年前

    我有一个测试JSON报告,如果有任何失败的子节点,如何标记父节点失败,如果子节点都通过,如何标记父节点通过?

    起初的

    {
        "scenario":
            {
                "server": {
                    "testsuit_1": {
                        "test_get": {"outcome": "passed"},
                        "test_set": {"outcome": "failed"}
                    },
                    "testsui_2": {
                        "test_get": {"outcome": "passed"},
                        "test_set": {"outcome": "passed"}
                    }
                },
                "client": {
                    'test_receive': {"outcome": 'pass'},
                    'test_send': {"outcome": 'fail'},
                }
            }
    }
    

    我必须将dict的原始dict转换为dict列表,因为没有空间添加新的dict outcome 钥匙

    期待

    [
        {
            'node_name': 'scenario',
            'outcome': 'failed',
            'children': [
                {
                    'node_name': 'server',
                    'outcome': 'failed',
                    'children': [
                        {
                            'node_name': 'testsuit_1',
                            'outcome': 'failed',
                            'children': [...]
                        },
                        {
                            'node_name': 'testsuit_2',
                            'outcome': 'pass',
                            'children': [...]
                        }
                    ]
                },
                {
                    'node_name': 'client',
                    'outcome': 'pass',
                    'children': [
                        {
                            'node_name': 'test_receive',
                            'outcome': 'pass',
                            'children': []
                        },
                        {
                            'node_name': 'test_send',
                            'outcome': 'pass',
                            'children': []
                        }
                    ]
                }
            ]
        }
    ]
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Chweng Mega    6 年前

    您可以创建两个函数:一个用于展望和确定用户是否失败,另一个用于遍历整个结构的主函数:

    def lookahead(d):
      if isinstance(d, str):
        return d == 'passed'
      if all('outcome' in b for b in d.values()):
         return all(b["outcome"] == "passed" for b in d.values())
      return all(lookahead(b) for b in d.values())
    
    def new_struct(d):
      return [{'node_name':a, 'outcome':['failed', 'pass'][lookahead(b)] if isinstance(b, dict) and 'outcome' not in b else b['outcome'], 'children':[] if not isinstance(b, dict) or 'outcome' in b else new_struct(b)} for a, b in d.items()]
    
    import json
    d = {'scenario': {'server': {'testsuit_1': {'test_get': {'outcome': 'passed'}, 'test_set': {'outcome': 'failed'}}, 'testsui_2': {'test_get': {'outcome': 'passed'}, 'test_set': {'outcome': 'passed'}}}, 'client': {'test_receive': {'outcome': 'pass'}, 'test_send': {'outcome': 'fail'}}}}
    print(json.dumps(new_struct(d), indent=4))
    

    输出:

     [
        {
        "node_name": "scenario",
        "outcome": "failed",
        "children": [
            {
                "node_name": "server",
                "outcome": "failed",
                "children": [
                    {
                        "node_name": "test_1",
                        "outcome": "failed",
                        "children": [
                            {
                                "node_name": "get",
                                "outcome": "passed",
                                "children": []
                            },
                            {
                                "node_name": "set",
                                "outcome": "failed",
                                "children": []
                            }
                        ]
                    },
                    {
                        "node_name": "test_2",
                        "outcome": "pass",
                        "children": [
                            {
                                "node_name": "get",
                                "outcome": "passed",
                                "children": []
                            },
                            {
                                "node_name": "set",
                                "outcome": "passed",
                                "children": []
                            }
                        ]
                    }
                ]
            },
            {
                "node_name": "client",
                "outcome": "failed",
                "children": [
                    {
                        "node_name": "receive",
                        "outcome": "pass",
                        "children": []
                    },
                    {
                        "node_name": "send",
                        "outcome": "fail",
                        "children": []
                    }
                ]
            }
        ]
      }
    ]