NoneType似乎被评估为True

时间:2018-06-24 18:41:18

标签: python django nonetype

我遇到此错误:

  File "/boo/foot/routing/models.py", line 133, in indexing
  contact = self.contact.get_full_name() if self.contact else '',
AttributeError: 'NoneType' object has no attribute 'get_full_name'

我的代码是:

class Visit(models.Model):
    contact = models.ForeignKey(Contact, on_delete=models.SET_NULL, null=True, blank=True )


    def indexing(self):
        obj = VisitIndex(
            meta = { 'id' : self.id },
            contact = self.contact.get_full_name() if self.contact  else '',
        )
        print(obj)
        obj.save()

并将索引方法附加到post_save信号上:

@receiver(post_save, sender = Visit)
def index_post(sender, instance, **kwargs):
    instance.indexing()

我正在测试self.contact是否不是为了得到get_full_name()的虚假……但是,即使使用NoneType,它似乎也能达到目标。问题可能在哪里?

1 个答案:

答案 0 :(得分:1)

您已经知道这一点,但是对于您的代码,仅当self.contactNone时才会发生该错误。但是,如果self.contactNone,则真实性测试将失败,因此无法访问该代码段。您对这两件事都是正确的。结论必须是某些东西与您的代码不一样。如果您尝试将一个最小的,可验证的示例放在一起(一小段代码,其他人可以运行该代码来重现该问题),那么您很可能会发现错误。这类似于结构化的调试过程(在找到源代码之前,缩小问题范围),当我尝试编写有关它们的好问题时,我经常发现自己发现了错误。

或者,作为第一步调试,仔细查看self.contact是否None会有所帮助?您还可以使测试更加精确(尽管没有必要):

def indexing(self):
    print(self.contact) # is it really None?
    if hasattr(self.contact, 'get_full_name'):
        contact = self.contact.get_full_name()
    else:
        contact = ''
    obj = VisitIndex(
        meta={ 'id' : self.id },
        contact=contact,
    )
    print(obj)
    obj.save()

这可以说是更“ pythonic”的,并且速度更快,但我不太喜欢:

try:
    get_full_name = self.contact.get_full_name
except AttributeError:
    contact = ''
else:
    contact = get_full_name()