【问题标题】:Python test if object existsPython测试对象是否存在
【发布时间】:2012-03-13 10:49:20
【问题描述】:

我认为使用 try: except: 进行流控制是不好的风格,但我不知道如何编写以下代码来测试 Django 中的 DB 字段是否存在。这是有效的“脏”代码:

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

【问题讨论】:

  • 为什么该字段永远不存在?
  • 第一次创建和保存之前
  • 出于好奇:您是遵循项目指南还是个人喜好?我会认为您不合格的except 风格不好,但如果您使用except AttributeError,则不会。我更喜欢你的第一个例子而不是你的第二个例子。
  • Python 是一种鼓励“请求宽恕,而不是许可”的语言。除非您认为该帐户大部分时间不存在的可能性更大,否则只需捕获一个(特定)异常。 docs.python.org/glossary.html#term-eafp

标签: python django object flow-control


【解决方案1】:

我猜你遇到了BankAccount.DoesNotExist 错误?如果是这种情况,您可以颠倒UserProfileBankAccount 之间的关系。看看Django ticket #10227,看看这里发生了什么。

话虽如此,如果我需要使用您的代码,我宁愿看到明确的 try...except 而不是解决方法,除非该解决方法确实有意义。

【讨论】:

  • 那张票正在描述我的确切问题。谢谢。我将使用 try: except DoesNotExist:
【解决方案2】:

我更喜欢你的第一个例子而不是你的第二个例子,但也许你可以使用hasattr(instance,'bank_account') 作为保障?

【讨论】:

    【解决方案3】:

    首先,您的第一个示例是执行此操作的首选方式(尽管您可能希望将 except 缩小到您期望此操作的异常)。

    我想你的 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),这样既可以检索值,又可以处理属性不存在的可能性。

    【讨论】:

      猜你喜欢
      • 2014-10-11
      • 2011-02-07
      • 1970-01-01
      相关资源
      最近更新 更多