加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python – 有一种优雅的方法可以避免数十个try / except块从json

发布时间:2020-12-20 13:02:14 所属栏目:Python 来源:网络整理
导读:我正在寻找方法来编写像get_profile(js)这样的函数但没有所有丑陋的尝试/例外. 每个赋值都在try / except中,因为偶尔json字段不存在.我很高兴有一个优雅的解决方案,默认一切都为无,即使我将一些默认设置为[]等,如果这样做会使整个代码更好. def get_profile(
我正在寻找方法来编写像get_profile(js)这样的函数但没有所有丑陋的尝试/例外.

每个赋值都在try / except中,因为偶尔json字段不存在.我很高兴有一个优雅的解决方案,默认一切都为无,即使我将一些默认设置为[]等,如果这样做会使整个代码更好.

def get_profile(js):
    """ given a json object,return a dict of a subset of the data.
        what are some cleaner/terser ways to implement this?

        There will be many other get_foo(js),get_bar(js) functions which
        need to do the same general type of thing.
    """

    d = {}

    try:
        d['links'] = js['entry']['gd$feedLink']
    except:
        d['links'] = []

    try:
        d['statisitcs'] = js['entry']['yt$statistics']
    except:
        d['statistics'] = {}

    try:
        d['published'] = js['entry']['published']['$t']
    except:
        d['published'] = ''

    try:
        d['updated'] = js['entry']['updated']['$t']
    except:
        d['updated'] = ''

    try:
        d['age'] = js['entry']['yt$age']['$t']
    except:
        d['age'] = 0

    try:
        d['name'] = js['entry']['author'][0]['name']['$t']
    except:
        d['name'] = ''

    return d

解决方法

试试像……

import time

def get_profile(js):
    def cas(prev,el):
        if hasattr(prev,"get") and prev:
            return prev.get(el,prev)
        return prev
    def getget(default,*elements):
        return reduce(cas,elements[1:],js.get(elements[0],default))

    d = {}
    d['links'] = getget([],'entry','gd$feedLink')
    d['statistics'] = getget({},'yt$statistics')
    d['published'] = getget('','published','$t')
    d['updated'] = getget('','updated','$t')
    d['age'] = getget(0,'yt$age','$t')
    d['name'] = getget('','author','name' '$t')
    return d

print get_profile({
    'entry':{
        'gd$feedLink':range(4),'yt$statistics':{'foo':1,'bar':2},'published':{
            "$t":time.strftime("%x %X"),},'updated':{
            "$t":time.strftime("%x %X"),'yt$age':{
            "$t":"infinity years",'author':{0:{'name':{'$t':"I am a cow"}}},}
})

对我来说,假设你有一个带有0的键而不是列表的字典,这是一种信念的飞跃,但是……你明白了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读