新手区 测试工具构建过程中字典列表多层嵌套取值

LEFT · 2018年06月14日 · 最后由 taflo 回复于 2018年06月15日 · 945 次阅读

最近一段时间,公司在着手开发一些测试相关工具,个人参与过程中遇到了字典列表多层嵌套的取值问题,关于此问题的解决方案,自己的一些拙见,敬请指正。

# 获取字典中的objkey对应的值,适用于字典列表嵌套
# test:字典
# objkey:目标key
# default:找不到时返回的默认值
# tmp_list:数据存储列表
# 字典遍历,遍历数据是字典,自执行,是列表执行列表
# 列表遍历,遍历数据是列表,自执行,是字典执行字典
#key值唯一
def list_get(test,objkey,default,tmp_list):
    for i in test:
        if isinstance(i,dict):
            dict_get(i,objkey,default,tmp_list)
        elif isinstance(i,list):
            list_get(i,objkey,default,tmp_list)

def dict_get(test,objkey,default,tmp_list):
    for k,v in test.items():
        if k != objkey:
            if isinstance(v,dict):
                dict_get(v,objkey,default,tmp_list)
            elif isinstance(v,list):
                list_get(v,objkey,default,tmp_list)
        else:
            k == objkey
            tmp_list.append(v)
    return tmp_list[0]
#test:字典
#objkey:目标key
#objupkey:目标上级key
#key值重复,筛选指定key值
def list_get(test, objkey,objupkey, default, tmp_list):
    for i in test:
        if isinstance(i, dict):
            dict_get(i, objkey,objupkey, default, tmp_list)
        elif isinstance(i, list):
            list_get(i, objkey,objupkey, default, tmp_list)


def dict_get(test, objkey,objupkey, default, tmp_list):
    for k, v in test.items():
        if  k != objupkey :
            if isinstance(v, dict):
                dict_get(v, objkey,objupkey, default, tmp_list)
            elif isinstance(v, list):
                list_get(v, objkey,objupkey, default, tmp_list)
        elif k == objupkey :
            if isinstance(v, list):
                for e in v:
                    if isinstance(e, dict):
                        for u,w in e.items():
                            if u == objkey:
                                if w != None:
                                    tmp_list.append(w)
            elif isinstance(v, dict):
                for u, w in v.items():
                    if u == objkey:
                        if w != None:
                            tmp_list.append(w)
    return tmp_list
共收到 5 条回复 时间 点赞

定义一个词法解析规则,比如“person.0.name.alias”,然后 split 后,再遍历解析,参考 httprunner

https://github.com/HttpRunner/HttpRunner/blob/master/httprunner/utils.py#L173:5

LEFT #2 · 2018年06月14日 作者
harris 回复

好的🙏,去参考学习一下

定义一个词法解析规则,比如“person.0.name.alias”,然后 split 后,再遍历解析,参考 httprunner

这种访问形式,python的话有现成的库 addict 传送门

LEFT #4 · 2018年06月14日 作者
taflo 回复

我在一个帖子里看到了你的回复,准备尝试,正在看addict的源码

LEFT 回复

👍 好学!

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册