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之常用模块学习(二)
模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...
随机推荐
- MachineLearning ---- lesson 1
该博文系列是Andrew NG教授的课程笔记,有兴趣的朋友可以在Coursera或者网易公开课上找到该课程. Supervised Learning 下图是一个监督学习回归分析的例子.该图旨在预测房价 ...
- 51nod-1222-最小公倍数计数
题意 给到 \(a,b\) ,求 \[ \sum _{i=a}^b\sum _x\sum _y[x\le y][\text{lcm}(x,y)=i] \] 即最小公倍数在 \([a,b]\) 中的有序 ...
- 【bzoj4542】[Hnoi2016]大数 莫队算法
题目描述 给出一个数字串,多次询问一段区间有多少个子区间对应的数为P的倍数.其中P为质数. 输入 第一行一个整数:P.第二行一个串:S.第三行一个整数:M.接下来M行,每行两个整数 fr,to,表示对 ...
- Ubuntu下搭建FTP服务器图解
在Linux中ftp服务器的全名叫 vsftpd,我们需要利用相关命令来开启安装ftp服务器,然后再在vsftpd.conf中进行相关配置,下面我来介绍在Ubuntu中vsftpd安装与配置增加用户的 ...
- 创建Django的App
一. 新建1个App,命令:python manage.py startapp lib 1. 打开终端 2. 新建 3. 把业务代码放到每一个APP里面就更专业了. 修改urls里面的代码如下: 运行 ...
- [SCOI2016]幸运数字 线性基
题面 题面 题解 题面意思非常明确:求树上一条链的最大异或和. 我们用倍增的思想. 将这条链分成2部分:x ---> lca , lca ---> y 分别求出这2个部分的线性基,然后合并 ...
- BZOJ3530:[SDOI2014]数数——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3530 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子 ...
- MyBatis之自查询,使用 递归实现 N级联动
A:首先先看下一个简单的面试题 斐波那契数列 计算数组{1,1,2,3,5,8.......} 第30位值 规律:1 1 从第三项开始,每一项都是前两项之和 有两种实现方式 第一种方式: public ...
- codeforces gym101243 A C D E F G H J
gym101243 A #include<iostream> #include<cstdio> #include<cmath> #include<cstrin ...
- Codeforces 578.C Weakness and Poorness
C. Weakness and Poorness time limit per test 2 seconds memory limit per test 256 megabytes input sta ...