Skip to main content
 首页 » 编程设计

用于控制流的 Python 嵌套 Try/Except/Else

2025年05月04日16傻小

我想以最优雅的 Python 方式实现的目标: 尝试在某个过滤器上查找数据库中的对象。仅当没有结果时,才尝试使用另一个过滤器查找对象。如果没有返回结果,则对象不存在,因此插入一个新实例。

我在想什么:

try: 
    obj = session.query(model).filter_by(field_a).one() 
except NoObjFound: 
    try: 
        obj = session.query(model).filter_by(field_b).one() 
    except NoObjFound: 
        insert_into_db(brand_new_obj) 
else: 
    update_the_obj(obj) 

我不确定这个 block 是否正确或处理我想要完成的事情的最佳方式。

请您参考如下方法:

我会建议这样的:

for filter in (field_a, field_b): 
    try: 
        obj = session.query(model).filter_by(filter).one() 
    except NoObjFound: 
        pass # or 'continue' 
    else: 
        update_the_obj(obj) 
        break 
else: 
    insert_into_db(brand_new_obj) 

这将确保正确的事情以正确的顺序发生,比嵌套的 try block 更具可读性,并且可以轻松扩展以添加更多的 filter。