上次我们说到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模块的使用(二)的更多相关文章

  1. glom模块的使用(一)

    glom模块的使用 简单说下glom模块主要是处理结构化数据用的,安装简单pip install glom即可,下面就glom的方法参数做例子讲解. glom 和模块同名的glom方法使用方法: .g ...

  2. ThinkPHP 3.2.3 简单后台模块开发(二)RBAC

    RBAC(Role-Based Access Controll)基于角色的访问控制 在 ThinkPHP3.2.3 中 RBAC 类位于 /ThinkPHP/Library/Org/Util/Rbac ...

  3. python全栈开发中级班全程笔记(第二模块)第 二 部分:函数基础(重点)

    python学习笔记第二模块         第二部分    :    函数(重点) 一.函数的作用.定义 以及语法 1.函数的作用 2.函数的语法和定义 函数:来源于数学,但是在编程中,函数这个概念 ...

  4. Day14 Python基础之os/sys/hashlib模块(十二)

    os模块 os.getcwd()  #获取当前工作路径 os.chdir(‘dirname1/dirname2/dirname3’) #改变当前脚本的工作路径,相当于cmd下的cd os.makedi ...

  5. python 模块学习(二)

    一.日志模块(logging ) 日志是一种追踪软件运行时所发生事件的方法 1.简单的日志编写(文件输出) import logging # 日志模块 # 日志配置,把日志内容存到文件中 loggin ...

  6. 【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器

    [摘要] timers模块部分源码和定时器原理 示例代码托管在:http://www.github.com/dashnowords/blogs 一.概述 Timer模块相关的逻辑较为复杂,不仅包含Ja ...

  7. 【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器

    目录 一.概述 二. 数据结构 2.1 链表 2.2 二叉堆 三. 从setTimeout理解Timer模块源码 3.1 timers.js中的定义 3.2 Timeout类定义 3.3 active ...

  8. 3) drf 框架生命周期 请求模块 渲染模块 解析模块 自定义异常模块 响应模块(以及二次封装)

    一.DRF框架 1.安装 pip3 install djangorestframework 2.drf框架规矩的封装风格 按功能封装,drf下按不同功能不同文件,使用不同功能导入不同文件 from r ...

  9. Python之常用模块学习(二)

    模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

随机推荐

  1. Web模块:spring-boot-starter-web

    spring-boot-autoconfigure-1.5.1.RELEASE.jar!/org/springframework/boot/autoconfigure/web 上述jar的web包下, ...

  2. BZOJ 2157 旅行(树链剖分码农题)

    写了5KB,1发AC... 题意:给出一颗树,支持5种操作. 1.修改某条边的权值.2.将u到v的经过的边的权值取负.3.求u到v的经过的边的权值总和.4.求u到v的经过的边的权值最大值.5.求u到v ...

  3. bzoj1923[Sdoi2010]外星千足虫(高斯消元)

    Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 包含一个“01”串和一个数字,用一个空格隔开.“01 ...

  4. MySQL join 使用方法

    JOIN 按照功能大致分为如下三类: INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录. LEFT JOIN(左连接):取得左表(table1)完全记录,即是右表(tab ...

  5. 【Java】SVN下载maven项目到eclipse之后,项目红叉,pom.xml出现Missing artifact fakepath:dubbo:jar:2.8.5等缺少jar包情况

    刚入公司,从svn上把代码弄下来之后导入eclipse,一般是maven项目,往往项目都会有红叉.如果排除代码本身问题,一般是jar包没有. 鼠标点开pom.xml文件,在约束那里一般有红叉,鼠标放上 ...

  6. [一]SpringBoot 之 HelloWorld

    (1)新建一个Maven Java工程 (2)在pom.xml文件中添加Spring BootMaven依赖 2.1在pom.xml中引入spring-boot-start-parent spring ...

  7. element-ui中单独引入Message组件的问题

    import Message from './src/main.js'; export default Message; 由于Message组件并没有install 方法供Vue来操作的,是直接返回的 ...

  8. C++解析(3):布尔类型与三目运算符

    0.目录 1.布尔类型 2.三目运算符 3.小结 1.布尔类型 C++中的布尔类型: C++在C语言的基本类型系统之上增加了bool C++中的bool可取的值只有true和false 理论上bool ...

  9. 【BZOJ4129】Haruna’s Breakfast(树上莫队)

    [BZOJ4129]Haruna's Breakfast(树上莫队) 题面 BZOJ Description Haruna每天都会给提督做早餐! 这天她发现早饭的食材被调皮的 Shimakaze放到了 ...

  10. 廖大大python学习笔记1

    列表classmates = ['Michael', 'Bob', 'Tracy']classmates.append('tom')print classmates# classmates.inser ...