Тест Python, если объект существует

Я считаю плохим стилем использовать try: исключением: для управления потоком, но я не могу понять, как написать следующий код, чтобы проверить, существует ли поле БД в Django. Это "грязный" код, который работает:

@receiver(pre_save, sender=UserProfile)
def create_user_profile(sender, instance=None, **kwargs):

    try:
        print str(instance.bank_account)
    except:
        print 'No account'

Я бы предпочел сделать что-то подобное, но я получаю исключение, когда if оператор выполняется, а объект не существует:

@receiver(pre_save, sender=UserProfile)
def create_user_profile(sender, instance=None, **kwargs):

    if instance.bank_account is None:
        print 'No account'
    else:
        print str(instance.bank_account)

3 ответа

Решение

Я предполагаю, что вы столкнулись с BankAccount.DoesNotExist ошибка? Если это так, вы можете изменить отношения между UserProfile а также BankAccount, Посмотрите на билет Django № 10227, чтобы узнать, что здесь происходит.

Тем не менее, если бы мне нужно было работать с вашим кодом, я бы предпочел увидеть явное try...except вместо обходного пути, если этот обходной путь на самом деле не имеет смысла.

Прежде всего, ваш первый пример - предпочтительный способ сделать это (хотя, возможно, вы захотите сузить исключение до тех исключений, которые вы ожидаете для этой операции).

Я полагаю, что ваше заявление if взрывается, когда instance is None; решение состоит в том, чтобы добавить тест в ваше заявление, чтобы проверить instance первый:

if instance and instance.bank_account:
    print str(instance.bank_account)
else: print 'No account'

Если вы не знаете, существует ли поле, вы можете заменить instance.bank_account с getattr(instance, 'bank_account', None), который одновременно извлекает значение и имеет дело с возможностью того, что атрибут не существует.

Я предпочитаю ваш первый пример вашему второму, но, возможно, вы могли бы использовать hasattr(instance,'bank_account') в качестве гарантии?

Другие вопросы по тегам