我有一个方法必须根据它们的存在返回三个对象中的一个。
我的实施
try:
return Model.objects.get(param=param)
except Model.DoesNotExist as ex:
# go to the next verification
pass
try:
return RelatedModel.objects.get(param=param).model
except RelatedMolel.DoesNotExist as ex:
# get the default model
pass
return Model.objects.get_default()
对python的大师提出这样的问题 - 它是一个比内部try / catch块更加pythonic的实现还是?
try:
return Model.objects.get(param=param)
except Model.DoesNotExist as ex:
try:
return RelatedModel.objects.get(param=param).model
except RelatedModel.DoesNotExist as ex:
return Model.objects.get_default()
答案 0 :(得分:6)
答案 1 :(得分:2)
文档告诉我们:
ObjectDoesNotExist
在django.core.exceptions
中定义。DoesNotExist
是基础ObjectDoesNotExist
异常的子类,它在每个模型类上提供,作为识别无法找到的特定对象类型的方法。
所以我要做的是:
queries = [lambda: Model.objects.get(param=param),
lambda: RelatedModel.objects.get(param=param).model,
lambda: Model.objects.get_default()]
for query in queries:
try:
return query()
except ObjectDoesNotExist:
pass
可以说这种方式不是“显而易见”,但它既平坦,又减少冗余,并将相关事物保持在一起。
答案 2 :(得分:0)
我并不认为自己是“蟒蛇大师”,无论如何,这是我的建议:
if
块时,避免诱惑将return
置于其中:只使用else
块,我发现这也适用于try...except
块。当然,只有深度不太重要时才有效。因此,我会这样写:
try:
res = Model.objects.get(param=param)
except Model.DoesNotExist:
try:
res = RelatedModel.objects.get(param.param).model
except RelatedModel.DoesNotExist:
res = Model.objects.get_default()
return res
由于您未使用ex
,因此无需指定其分配。