博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
glom模块的使用(二)
阅读量:6306 次
发布时间:2019-06-22

本文共 2365 字,大约阅读时间需要 7 分钟。

上次我们说到golm的简单应用,

这次我们继续对glom的其他操作进行学习。

Literal

用法:class glom.Literal(value)

这个方法的功能主要是添加自定义的键值。

例如:

from glom import glom,Literaltarget = {
'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,输出eg5=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,Tclass 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)复制代码

更多文章关注公众号:python学习开发

博客园地址:www.cnblogs.com/c-x-a

你可能感兴趣的文章
面试/编程
查看>>
linux每日命令(16):head命令
查看>>
公司内部分享【富有成效的每日站会】总结
查看>>
打造一个上传图片到图床利器的插件(Mac版 开源)
查看>>
iOS横竖屏
查看>>
thinkphp判断更新是否成功
查看>>
Do While ... Loop 与 Do Until ... Loop 的区别
查看>>
【Linux】查询某个字符串出现次数
查看>>
高效使用jquery之一:请使用'On'函数
查看>>
冲刺第一周第三天
查看>>
ERP环境检测工具设计与实现 Environment Detection
查看>>
不要在构造中做太多事情,不然有时候会出现有意思的代码~
查看>>
IIS 发布网站遇到的问题
查看>>
NuGet学习笔记(2)——使用图形化界面打包自己的类库
查看>>
xcode中没有autoSizing的设置
查看>>
字符编码
查看>>
企业应用:应用层查询接口设计
查看>>
浅谈Excel开发:十 Excel 开发中与线程相关的若干问题
查看>>
nfd指令的详细说明
查看>>
安装VisualSvn Server时遇到的问题
查看>>