我有一长串的try除了声明:
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
Run Code Online (Sandbox Code Playgroud)
有没有更简洁的方式来写这个?
如果您厌倦了在get()调用中找出默认值的用途,只需编写辅助函数:
def resolve(root, *keys):
for key in keys:
try:
root = root[key]
except (KeyError, IndexError):
return None
return root
Run Code Online (Sandbox Code Playgroud)
然后你就写了,例如:
uri = resolve(entry_obj, 'media$group', 'media$content', 0, 'url')
Run Code Online (Sandbox Code Playgroud)
为了简化调用,您可以加强辅助函数,为键获取单个字符串并在空格上分割; 这样你就不必输入那么多引号,我们也可以添加一个默认值参数:
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', '')
Run Code Online (Sandbox Code Playgroud)