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的键而不是列表的字典,这是一种信念的飞跃,但是……你明白了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容