glom模組的使用(二)

公號_python學習開發發表於2018-10-25


glom模組的使用(二)

上次我們說到golm的簡單應用,glom模組的使用(一)

這次我們繼續對glom的其他操作進行學習。

Literal

用法:class glom.Literal(value)

這個方法的功能主要是新增自定義的鍵值。

例如:

from glom import glom,Literaltarget = {'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,輸出eg5=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)複製程式碼
glom模組的使用(二)

上面的程式碼實際是,做一了一個類似Literal的功能。找鍵值為a的而且值為a的,如果找到就返回,找不到就賦值OMIT可以得到一個空字典,當然們也可以把上面else OMIT替換為else "666"可以發現我們得到了一個含有鍵值為666的結構化資料。

glom模組的使用(二)

Call

用法:glom.Call(func, args=None, kwargs=None)

使用call減少lamda的使用率,做和lamda差不多的功能。

-當target裡面需要使用函式時除了使用lamda外還可以用Call。

-Call類似functools.partial的用法,另外可讀性比lamda要強的多。


from glom import glom,Call,Tclass 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)複製程式碼


更多文章關注公眾號:python學習開發

部落格園地址:www.cnblogs.com/c-x-a




相關文章