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

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

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

这次我们继续对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)
gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAA

上面的代码实际是,做一了一个类似Literal的功能。找键值为a的而且值为a的,如果找到就返回,找不到就赋值OMIT可以得到一个空字典,当然们也可以把上面else OMIT替换为else "666"可以发现我们得到了一个含有键值为666的结构化数据。

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAA

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)

转载地址:http://qyzeo.baihongyu.com/

你可能感兴趣的文章
I.MX6 Android CAN 命令行测试
查看>>
linux shell except tcl login ssh Automatic interaction
查看>>
iOS JSONModel解析数据成Model
查看>>
QQ空间抢车位刷钱方法汇总
查看>>
[LeetCode] Missing Number
查看>>
java.lang.IllegalStateException: Illegal access
查看>>
STL容器的效率比较
查看>>
Ckeditor使用总结
查看>>
人事面试100问题--巧妙应答
查看>>
【工具类】怎么进入阿里云docker仓库
查看>>
Ceres-Solver库入门
查看>>
悲惨而又丢人的创业经历:草根创业者含恨倾诉为什么失败
查看>>
理解WebKit和Chromium: WebKit, WebKit2, Chromium和Chrome介绍
查看>>
hanoi塔的递归算法
查看>>
C# 校验给定的ip地址是否合法
查看>>
lumen 登陆 注册 demo
查看>>
基于服务的并行系统的通讯方式探讨
查看>>
设计模式——观察者模式
查看>>
Python多线程 简明例子
查看>>
《地球上的星星》
查看>>