glom模块的使用(二)
上次我们说到golm的简单应用这次我们继续带结构化数据的其他操作进行学习。
Literal
用法:class glom.Literal(value)
这个方法的功能主要是添加自定义的键值。
例如:
from glom import glom,Literal
target = {'a': {'b': 'c'}}
spec = {'a': 'a.b', 'e': Literal('666')}
spec2 = {'a': 'a.b', 'e': lambda x:"666"}
print(glom(target, spec))
print(glom(target, spec2))
输出后可以发现结果是一样的:
{'a': 'c', 'e': '666'}
{'a': 'c', 'e': '666'}
Coalesce
用法:classglom.Coalesce(*subspecs, **kwargs)
该方法会对参数进行挨个尝试,如果都没有就报错,但是可以给定一个默认值,具体用法我们使用几个实例,下面从简单到复杂延时该方法的使用
from glom import glom,Coalesce,CoalesceError
只查一级键值
target = {'c': 'd'}
g1=glom(target, Coalesce('a', 'b', 'c'))
print(g1)
target = {'c': 'd'}
# g2=glom(target, Coalesce('a', 'b', 'm')) #找不到键值为a,b,m的所以报错,类型CoalesceError。
# print(g2)
g3=glom(target, Coalesce('a', 'b', 'm'),skip_exc=CoalesceError) #找不到键值为a,b,m的所以报错,跳过错误CoalesceError,返回值为None。
print(g3)
g4=glom(target, Coalesce('a', 'b', 'm'),default="666") #找不到键值为a,b,m的所以报错,设置其值并返回值为666。
print(g4)
#查多级键值和之前的spec的使用方法是一样的
target2 = {'a': 'b',"c":[{'t':"e"}]}
spec1={"name":(Coalesce('b', 'c'),['t'])}#找b开始的键值,没有找到然后找c找到了,再找c所在列表里的键值t,输出e
g5=glom(target2,spec1)
print(g5)
spec2={"name":(Coalesce('a', 'b', 'c'),['t'])}#因为a找到之后,会去找t,但是a后面没有t了所以报错。
g6=glom(target2,spec2,default="6666")#防止g6出错,给定个默认值
print(g6)
target3 = {'a': 'b','a': [{'t':"e1"}],"c":[{'t':"e"}]}
g7=glom(target3,spec2)
print(g7)
注意点:
经过上面的一系列操作可以发现,Coalesce在找到第一级键值之后就不继续往下找了,然后找下级的键值g6的情况因为a下面没有t了所以报错。
换做g7,因为a下面同样有t所以可以输出为{'name': ['e1']}。
OMIT
用法glom.OMIT= Sentinel('OMIT')
经过研究OMIT实际是返回一个空的字典用的,我们来看代码
target4 = {'a': 'b'}
spec3 = {'a': lambda t: t['a'] if t['a'] == 'a' else OMIT}
g8=glom(target4, spec3)
target4 = {'a': 'a'}
g9=glom(target4, spec3)
print(g8)
print(g9)
上面的代码实际是,做一了一个类似Literal的功能。找键值为a的而且值为a的,如果找到就返回,找不到就赋值OMIT可以得到一个空字典,当然们也可以把上面else OMIT替换为else "666"可以发现我们得到了一个含有键值为666的结构化数据。
Call
用法:glom.Call(func, args=None, kwargs=None)
使用call减少lamda的使用率,做和lamda差不多的功能。
-当target里面需要使用函数时除了使用lamda外还可以用Call。
-Call类似functools.partial的用法,另外可读性比lamda要强的多。
from glom import glom,Call,T
class ExampleClass(object):
def __init__(self, attr):
self.attr = attr
self.name = "666"
target = {'attr': 3.14}
a=glom(target, Call(ExampleClass, kwargs=T))
等价于
glom(target, lambda target: ExampleClass(**target))
print(a.name)
T
关于T的用法后续我们再进行研究。
glom模块的使用(二)的更多相关文章
- glom模块的使用(一)
glom模块的使用 简单说下glom模块主要是处理结构化数据用的,安装简单pip install glom即可,下面就glom的方法参数做例子讲解. glom 和模块同名的glom方法使用方法: .g ...
- ThinkPHP 3.2.3 简单后台模块开发(二)RBAC
RBAC(Role-Based Access Controll)基于角色的访问控制 在 ThinkPHP3.2.3 中 RBAC 类位于 /ThinkPHP/Library/Org/Util/Rbac ...
- python全栈开发中级班全程笔记(第二模块)第 二 部分:函数基础(重点)
python学习笔记第二模块 第二部分 : 函数(重点) 一.函数的作用.定义 以及语法 1.函数的作用 2.函数的语法和定义 函数:来源于数学,但是在编程中,函数这个概念 ...
- Day14 Python基础之os/sys/hashlib模块(十二)
os模块 os.getcwd() #获取当前工作路径 os.chdir(‘dirname1/dirname2/dirname3’) #改变当前脚本的工作路径,相当于cmd下的cd os.makedi ...
- python 模块学习(二)
一.日志模块(logging ) 日志是一种追踪软件运行时所发生事件的方法 1.简单的日志编写(文件输出) import logging # 日志模块 # 日志配置,把日志内容存到文件中 loggin ...
- 【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器
[摘要] timers模块部分源码和定时器原理 示例代码托管在:http://www.github.com/dashnowords/blogs 一.概述 Timer模块相关的逻辑较为复杂,不仅包含Ja ...
- 【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器
目录 一.概述 二. 数据结构 2.1 链表 2.2 二叉堆 三. 从setTimeout理解Timer模块源码 3.1 timers.js中的定义 3.2 Timeout类定义 3.3 active ...
- 3) drf 框架生命周期 请求模块 渲染模块 解析模块 自定义异常模块 响应模块(以及二次封装)
一.DRF框架 1.安装 pip3 install djangorestframework 2.drf框架规矩的封装风格 按功能封装,drf下按不同功能不同文件,使用不同功能导入不同文件 from r ...
- Python之常用模块学习(二)
模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...
随机推荐
- 【.Net+数据库】sqlserver的四种分页方式
第一种:ROW_NUMBER() OVER()方式 select * from ( select *, ROW_NUMBER() OVER(Order by ArtistId ) AS RowId ...
- FZU2127_养鸡场
题目的意思为要你求出满足三边范围条件且周长为n的三角形的数目. 其实做法是直接枚举最短边,然后就可以知道第二条边的取值范围,同时根据给定的范围缩小范围. 同时根据第二条边的范围推出第三条边的范围,再次 ...
- java网络编程(二)可中断套接字
参考资料:java核心技术 卷II 为中断套接字操作,可使用java.nio包提供的SocketChannel类.可以使用如下方式打开SocketChannel: SocketChannel chan ...
- 【JavaScript】JAVA-input如何占满整个td
如果使用下面这种方式,不会出现占满效果 <tr> <td colspan="2"> <input width="90%" alig ...
- 题解 P1478 【陶陶摘苹果(升级版)】
看着你们累死累活得快排.冒泡.结构体特殊冒泡.还有dp... 蒟蒻表示真的不用那么麻烦! 难度:新手村+1 压行情况:0 理解难度:0 首先我们来了解一下优先队列:(自己抄的自己...) 讲元素一个个 ...
- BZOJ3110 K大数查询 【线段树 + 整体二分 或 树套树(非正解)】
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- tomcat7.x远程命令执行(CVE-2017-12615)漏洞漏洞复现
tomcat7.x远程命令执行(CVE-2017-12615)漏洞漏洞复现 一.漏洞前言 2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,漏洞CVE编号:CVE-2017 ...
- 【recording】gdoi2018
怎么说..虽然感觉其实..不太想写游记.. 但是回来看着桌面上的课本还是忍不住了(想想班里进度就..qwq)还是写一下吧 Day x(x<0) 之前大家溜到首都开心集训了一波然后被虐的很开心.. ...
- Spring MVC @RequestParam
案例来说明 @RequestMapping("user/add") public String add(@RequestParam("name") String ...
- js 多个事件的绑定及移除(包括原生写法和 jquery 写法)
需要打开控制台查看效果: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...