Skip to main content
 首页 » 编程设计

python之Python 中一长串 Try-Except 语句的简洁替换

2025年05月04日13mfrbuaa

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