Python测试是否存在对象

问题描述:

我认为它是不好的风格来使用try:except:对于流控制,但我不知道如何编写下面的代码来测试Django中的DB字段是否存在。这是“脏”的代码工作:Python测试是否存在对象

@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) 
+0

为什么字段永远不存在? – 2012-03-13 10:52:32

+0

第一次创建和保存 – j7nn7k 2012-03-13 10:54:21

+2

出于好奇:您是遵循项目指南还是个人喜好?我会考虑你的不合格''除了坏风格,但如果你使用'AttributeError'除外。那么我更喜欢你的第一个例子。 – 2012-03-13 10:55:21

我猜你遇到一个BankAccount.DoesNotExist错误?如果是这种情况,您可以撤消UserProfileBankAccount之间的关系。看看Django ticket #10227,看看这里发生了什么。这就是说,如果我需要处理你的代码,我宁愿看到明确的try...except而不是解决方法,除非该解决方法实际上是有意义的。

+0

该票证描述了我确切的问题。谢谢。我将使用try:除DoesNotExist: – j7nn7k 2012-03-13 11:27:02

我非常喜欢你的第一个例子,但也许你可以使用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' 

如果你不知道,如果字段存在,你可以用getattr(instance, 'bank_account', None),这既检索值,和交易替代instance.bank_account该属性不存在的可能性。