glom模块的使用(二)

2019-03-20 14:54:52 553

上次我们说到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)
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)

模块 class

作者

cxa
TA的文章

相关文章