zoukankan      html  css  js  c++  java
  • python 比较内嵌字典的值

    比较两个嵌套字典的值是否相等,不相等,打印出错误value的key路径

    #!/usr/bin/python
    # -*- encoding: utf-8 -*-
    
    def check_result(actual_result, expect_result, ignore=None):
        '''
        检查重启前后数据是否一致
        :param actual_result: 实际的数据
        :param expect_result: 期望的数据
        :param ignore: 忽略不进行比较的键
        :return: 返回检查结果
        '''
        failed = []
        check_rest = True
        def check_data(actual, expect, ignore=None, path=''):
            '''
            检查重启前后数据是否一致
            :param actual: 实际的数据
            :param expect: 期望的数据
            :param ignore: 忽略不进行比较的键
            :return: 返回检查结果和失败的value在原数据中的键路径
            '''
            ignore = ignore if ignore else []
    
            dict_type = [dict]
            array_type = [list, tuple, set]
    
            actual_type = type(actual)
            expect_type = type(expect)
    
            # 检查数据类型一致
            if actual_type == expect_type:
                check_ret = True
    
                # 判断数据类型为数组类型, 且数据中元素相等
                if actual_type in array_type:
                    if len(actual) == len(expect):
                        for act_ele, exp_ele in zip(actual, expect):
                            ret = check_data(act_ele, exp_ele)
                            check_ret = ret if not ret and check_ret else check_ret
    
                        return check_ret
    
                    else:
                        return '数据的元素不一致, actual: %s, expect: %s' % (actual, expect)
    
                # 判断数据类型为键值对类型
                elif actual_type in dict_type:
                    actual_keys = sorted(actual.keys())
                    expect_keys = sorted(expect.keys())
    
                    # 检查数据的键值对相同
                    if actual_keys == expect_keys:
                        for key in actual:
                            # 检查key是否需要检查
                            if key not in ignore:
                                ret = check_data(actual[key], expect[key], path=path + '/' + key)
                                check_ret = ret if not ret and check_ret else check_ret
    
                        return check_ret
    
                    else:
                        return '数据的key不一致, actual_keys: %s, expect_keys: %s' % (actual_keys, expect_keys)
    
                # 判断数据类型不为容器类型, 比较值的是否相等
                else:
                    if actual == expect:
                        return True
                    else:
                        failed.append(path)
                        return False
            else:
                return '数据的数据类型不一致, actual_type type: %s, expect_type type: %s' % (actual_type, expect_type)
    
        check_ret = check_data(actual_result, expect_result, ignore=ignore)
        check_rest = check_ret if not check_ret and check_rest else check_rest
    
        return check_rest, failed
  • 相关阅读:
    阿里云快速搭建Node.js开发环境
    初始化阿里云服务器
    docker上安装tomcat
    阿里云搭建支付宝小程序
    阿里云docker上安装redis
    WARN o.a.c.c.AprLifecycleListener [log,175] The Apache Tomcat Native library failed to load. The error reported was [no tcnative1 in java.library.path:
    阿里云快速搭建网站
    云服务器(CentOS系统)完全卸载mysql
    wumeismart编译运行和部署系统
    阿里云ssh关闭,保持jar程序运行
  • 原文地址:https://www.cnblogs.com/gxfaxe/p/14499569.html
Copyright © 2011-2022 走看看