More pythonic way for exceptions?

I have a method that should return one of three objects depending on their existence.

My implementation

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()

So, the question for the python guru is a more pythonic implementation than the internal try / catch blocks or?

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()
+4
source share
3 answers

From Zen of Python ( import this):

Flat is better than nested.

In this case, I would prefer the first version.

+6
source

Documents tell us:

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

"-", , :

  • , , .
  • - : 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, .

0
source

All Articles