【问题标题】:NoneType seems to be evaluated as True [closed]NoneType 似乎被评估为 True [关闭]
【发布时间】:2018-12-03 09:42:27
【问题描述】:

我遇到了这个错误:

  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 似乎也能到达那部分。问题可能出在哪里?

【问题讨论】:

  • 任何其他 None; False;空容器(字符串、字典、列表);数字零;并且用户定义的 False 在 Python 中为 True。 type(None) 不是空的,也不是任何定义的 False 事物——因此是 True。见Boolean Operations in Python
  • 输出self.contact怎么样?第一次访问该对象时,它是一个 ForeignKey 表示 - 结果可能会有所不同。 @dawg - 如果它是一个类型对象,错误消息将是“.. type object 'NoneType' ...”。
  • @MatsLindh 我会尝试让他输出 self.contact

标签: python django nonetype


【解决方案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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2020-08-15
    • 1970-01-01
    • 2023-02-21
    • 2016-02-08
    • 2018-07-22
    • 1970-01-01
    相关资源
    最近更新 更多