glom模块的使用(二)

简介: 上次我们说到golm的简单应用,glom模块的使用(一)这次我们继续对glom的其他操作进行学习。Literal用法:class  glom.Literal(value)这个方法的功能主要是添加自定义的键值。

上次我们说到golm的简单应用,glom模块的使用(一)

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

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)
目录
相关文章
|
11月前
|
JavaScript 前端开发 Android开发
转换 ES6 代码时需要注意哪些兼容性问题
在转换ES6代码时,需关注兼容性问题,如箭头函数、模板字符串、let/const等语法在旧浏览器中的支持情况,以及模块化、类、Promise等特性是否需要polyfill。使用Babel等工具可有效解决大部分兼容性问题。
|
存储 编解码 数据处理
【FFmpeg 视频基本格式】深入理解FFmpeg:从YUV到PCM,解码到编码(二)
【FFmpeg 视频基本格式】深入理解FFmpeg:从YUV到PCM,解码到编码
370 0
|
11月前
|
存储 Python
CSV文件
【10月更文挑战第18天】CSV文件
680 2
成功解决TypeError: ‘encoding’ is an invalid keyword argument for this function
成功解决TypeError: ‘encoding’ is an invalid keyword argument for this function
|
11月前
|
存储 前端开发 JavaScript
深入理解React组件的生命周期与Hooks
【10月更文挑战第7天】深入理解React组件的生命周期与Hooks
457 0
|
11月前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。
|
搜索推荐 算法 JavaScript
探索冒泡排序:原理、实现与优化
探索冒泡排序:原理、实现与优化
|
11月前
|
SQL 安全 API
在API 接口的设计中,如何保证数据的安全性和完整性?
在API接口设计中,确保数据安全与完整至关重要。关键措施包括:采用HTTPS协议防数据泄露;强认证机制(如OAuth2/JWT)确保用户授权;敏感数据加密(如AES);签名加时间戳防重放攻击;输入验证防SQL注入等攻击;恰当错误处理避免敏感信息泄露;限频防滥用及DDoS攻击;详尽日志记录助安全审计;数据完整性校验(如哈希比对);版本控制保兼容;严格避免响应中泄露敏感信息;定期安全审计与测试。这些措施共同保障API安全。
1485 0
|
Ubuntu 固态存储
如何在 Ubuntu 20.04 上添加交换空间?
如何在 Ubuntu 20.04 上添加交换空间?
299 0
如何在 Ubuntu 20.04 上添加交换空间?
|
JavaScript
element-ui(vue)upload组件的http-request方法的使用
element-ui(vue)upload组件的http-request方法的使用
588 0