我有一长串 try except 语句:
try:
uri = entry_obj['media$group']['media$content'][0]['url']
except (KeyError, IndexError):
uri = None
try:
position = entry_obj['yt$position']['$t']
except KeyError:
position = None
try:
description = entry_obj['content']['$t']
except KeyError:
description = None
try:
seconds = entry_obj['media$group']['yt$duration']['seconds']
except KeyError:
seconds = None
try:
thumbnails = entry_obj['media$group']['media$thumbnail']
except KeyError:
thumbnails = None
有没有更简洁的写法?
请您参考如下方法:
如果您厌倦了弄清楚在 get() 调用中使用什么作为默认值,只需编写一个辅助函数:
def resolve(root, *keys):
for key in keys:
try:
root = root[key]
except (KeyError, IndexError):
return None
return root
然后你就写,例如:
uri = resolve(entry_obj, 'media$group', 'media$content', 0, 'url')
为了稍微简化调用,您可以加强辅助函数以采用单个字符串作为键并按空格拆分;这样你就不必输入那么多引号,我们还可以添加一个默认值参数:
def resolve(root, keys, default=None):
for key in keys.split():
try:
root = root[key]
except (TypeError, KeyError):
try:
root = root[int(key)]
except (IndexError, ValueError, KeyError):
return default
uri = resolve(entry_obj, 'media$group media$content 0 url', '')
