控件F的Python嵌套Try/Except/Else

2024-06-30 08:11:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我不确定这个块是正确的还是处理我要完成的任务的最佳方法。在


Tags: 对象方法数据库objfieldbymodelsession
2条回答

我建议你这样做:

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

这是不正确的。假设您想在找到独立于哪个过滤器找到它的对象之后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)

相关问题 更多 >