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

Я считаю, что плохой стиль использовать try: за исключением: для управления потоком, но я не могу понять, как написать следующий код, чтобы проверить, существует ли поле DB в 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 Solutions collect form web for “Тест Python, если объект существует”

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

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

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

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

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

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

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

Python - лучший язык программирования в мире.