简洁地替换Python中的一长串Try-Except语句?

Mic*_*ael 1 python

我有一长串的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)

有没有更简洁的方式来写这个?

kin*_*all 9

如果您厌倦了在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)