• 解析接口报文


    转载,出处 :https://www.cnblogs.com/Detector/p/8085460.html   

    背景

    在做接口自动化的过程中,接口返回的数据是  列表字典循环嵌套  格式的,所以怎样通过一个key值,获取到被包裹了多层的目标数据成为了摆在我面前的一个问题。

    一开始没想自己写,但是搜索后发现虽然很多人遇到类似的问题,但是相应的解决方案都不能达到我想要的结果,所以自己尝试写了一个。

    思路

    最初的做法是写一个函数,每次对传入的数据进行类型判断,然后根据数据类型做对应的处理,后来发现如果这样,实际有多少层数据就要做多少次判断。

    那么有没有一劳永逸的方法呢?答案当然是有!

    调试过程中发现,函数的调用特别符合递归的规律,但是和一般递归的略有不同,需要两个函数相互调用递归。实测可以完美解决这个问题!

    具体思路如下:

    新建两个函数A和B,函数 A处理字典数据,被调用后,判断传递的参数,如果参数为字典,则调用自身;

    如果是列表或者元组,则调用列表处理函数B;

    函数 B处理列表,被调用后,判断传递的参数,如果参数为列表或者元组,则调用自身;

    如果是字典,则调用字典处理函数A;

    参考代码

    注释已经写得比较清晰,就不多解释了:

    复制代码
    #! /usr/bin/python
    # coding:utf-8 
    """ 
    @author:Bingo.he 
    @file: get_target_value.py 
    @time: 2017/12/22 
    """
    def get_target_value(key, dic, tmp_list):
        """
        :param key: 目标key值
        :param dic: JSON数据
        :param tmp_list: 用于存储获取的数据
        :return: list
        """
        if not isinstance(dic, dict) or not isinstance(tmp_list, list):  # 对传入数据进行格式校验
            return 'argv[1] not an dict or argv[-1] not an list ' 
        if key in dic.keys():
            tmp_list.append(dic[key])  # 传入数据存在则存入tmp_list
        else:
            for value in dic.values():  # 传入数据不符合则对其value值进行遍历
                if isinstance(value, dict):
                    get_target_value(key, value, tmp_list)  # 传入数据的value值是字典,则直接调用自身
                elif isinstance(value, (list, tuple)):
                    _get_value(key, value, tmp_list)  # 传入数据的value值是列表或者元组,则调用_get_value
        return tmp_list
    
    
    def _get_value(key, val, tmp_list):
        for val_ in val:
            if isinstance(val_, dict):  
                get_target_value(key, val_, tmp_list)  # 传入数据的value值是字典,则调用get_target_value
            elif isinstance(val_, (list, tuple)):
                _get_value(key, val_, tmp_list)   # 传入数据的value值是列表或者元组,则调用自身
    复制代码

    效果图

    下图对对这个方法做了测试,能从很复杂的多重嵌套数据中正常获取到想要的值,测试数据:

    test_dic = {'a': '1', 'b': '2', 'c': {'d': [{'e': [{'f': [{'v': [{'g': '6'}, [{'g': '7'}, [{'g': 8}]]]}, 'm']}]}, 'h', {'g': [10, 12]}]}}

    调试过程中遇到的坑

    初始时,博主将存储获取数据的临时list放到了函数的参数里,这样调用时候就可以少传一个参数,但是后来发现,单次调用的时候不存在问题,但是多次调用的时候,会同时返回上一次调用的值,

    这可能是python函数本身的一个bug

    def get_target(a, b=[]):
        b.append(a)
        print(b)
    
    get_target(1)
    get_target(2)

    后来查了很多资料了解到,参数默认值,只会在函数声明时初始化一次,之后不会再初始化

    下面这段代码定义和调用也是存在细微差别的

    def foo(*args, **kargs):
        pass
        
    foo(*args, **kargs)
  • 相关阅读:
    Java基础--day04
    Java基础--day03
    Java基础--day02
    高斯键盘设置指南
    博客园主题配置
    算法笔记--二分
    Test2反思
    树链剖分【模板】
    7.20关于莫队算法的一些初步理解
    分块(n根n复杂度)
  • 原文地址:https://www.cnblogs.com/duanwangye/p/9384723.html
Copyright © 2020-2023  润新知