• 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的用法后续我们再进行研究。

  • 相关阅读:
    ActiveMQ-在Centos7下安装和安全配置
    Servlet基础知识点
    Filter的执行顺序
    Dubbo-使用Maven构建Dubbo服务的可执行jar包
    Dubbo-Centos7管控台安装
    Spring 小知识点
    Zookeeper+ActiveMQ集群搭建
    Zookeeper在Centos7上搭建单节点应用
    SpringMVC+AJAX+JSON
    RocketMQ-Filer
  • 原文地址:https://www.cnblogs.com/c-x-a/p/9371452.html
Copyright © 2020-2023  润新知