Python嵌套的Try/Except/Else控制流
我想用最优雅的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
也很简单。