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
原文地址:https://www.cnblogs.com/gxfaxe/p/14499569.html