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

1 投票
2 回答
889 浏览
提问于 2025-04-18 06:46

我想用最优雅的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)

我不确定这个代码块是否正确,或者是否是实现我想要的目标的最佳方法。

2 个回答

0

这个说法是不对的。如果你想在找到对象后,不管是哪个过滤器找到的,都要执行 update_the_obj(obj),那么最后的 else 语句对内部过滤器来说是隐藏的。

你可以试试:

obj = None
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)

if obj is not None:
    update_the_obj(obj)
6

我建议可以这样做:

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 块,这种写法更容易阅读,而且也很方便,后面如果需要添加更多的 filter 也很简单。

撰写回答