Есть хороший способ обработки исключений в Python? - PullRequest
6 голосов
/ 25 июня 2010

У меня есть код, который выглядит примерно так:

                try:
                    auth = page.ItemAttributes.Author
                except:
                        try:
                            auth = page.ItemAttributes.Creator
                        except:
                                auth = None

Есть ли лучший способ написать эту логику? Это делает мой код действительно болезненным для чтения. Я думал, что попробовать .. в конце концов будет работать, но я предположил, что неправильно

Ответы [ 3 ]

11 голосов
/ 25 июня 2010

Вы можете использовать hasattr, чтобы избежать блоков try / кроме:

auth = None
for attrname in ['Author', 'Creator']:
    if hasattr(page.ItemAttributes, attrname):
        auth = getattr(page.ItemAttributes, attrname)
        break

Альтернативный способ написать выше - использовать предложение else цикла Python for:

for attrname in ['Author', 'Creator']:
    if hasattr(page.ItemAttributes, attrname):
        auth = getattr(page.ItemAttributes, attrname)
        break
else:
    auth = None
3 голосов
/ 25 июня 2010

Это делает мой код очень болезненным для чтения

Что бы ты ни делал, не лови подстановочные знаки. except: - это питонский способ сказать: Hey, all exceptions are equal, I want every single error in my try block to end up here, I don't care if I catch an AttributeError or a WorldGotFuckedUpException. В вашем случае except AttributeError намного, намного лучше и легче для чтения.

Это просто примечание. Ответ Марка показывает лучший способ сделать это, ИМХО.

2 голосов
/ 25 июня 2010

@ Ответ Марка Байерса более гибкий, но если вы хотите получить однострочник

auth = getattr(page.ItemAttributes, 'Author', None) or getattr(page.ItemAttributes, 'Creator', None)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...