python类属性不在if条件中计算

时间:2010-11-10 09:42:00

标签: python

我有一个python类如下

class Application(models.Model):
    name = models.CharField(help_text="Application's name",max_length=200)
    current_status = models.IntegerField(null=True, blank=True)
    class Meta:
        ordering = ["name"]

    @property
    def status(self):
        """Returns the current ApplicationStatus object of this Application."""
        try:
            return ApplicationStatus.objects.get(id = self.current_status)
        except ApplicationStatus.DoesNotExist as e:
            print e
            return None

在另一个课程中,我会检查属性状态,如以下语句

    app = Application()
    if app.status is None:
        #do some thing
    else:
        print app.status

虽然我确定应用程序的状态不是None,但是else print语句打印None,当我尝试访问app.status.id之类的状态时,应用程序抛出异常NoneType has no property id。< / p>

当我将条件改为:

    app = Application()
    st = app.status
    if st is None:
        #do some thing
    else:
        #do another thing

它工作正常。

有人能告诉我为什么没有在print语句中评估python属性吗?

4 个答案:

答案 0 :(得分:0)

你说:

  

虽然我确定应用程序的状态不是None,但执行了else子句

您发布的代码是:

if app.status is None:
        #do some thing
else:
        #do another thing

如果status不是None,那么将执行else子句。

如果第二种情况如何起作用,我无法理解,因为else子句也应该在这里执行。

答案 1 :(得分:0)

你说app.status传递了第一个if条件(所以它不是None)但是当你打印它时,它会打印出无......

很明显,app.status首次返回与None不同的内容,第二次更改内容并且app.status(每次都评估)返回None

实际上如果你将app.status返回的值存储在另一个var中(所以它没有被修改)它可以正常工作......

答案 2 :(得分:0)

我认为原因是你执行的代码是相同代码的两倍,但具有不同的上下文:

试试这个测试:

print app.status
print app.status

第一次打印应该不是None,但是第二次打印是: 你必须在两个调用之间查看改变为Application对象的内容(你有信号等等) 尝试在状态函数中打印self.current_status。

答案 3 :(得分:0)

问题可能在ApplicationStatus类上。

事实上,你在非工作样本中所做的是两次调用“ApplicationStatus.objects.get(id = self.current_status)”。也许,在第一次,它确实返回一个有效值,并确实改变它的状态,所以在第二次调用中,它确实返回None(或抛出一个ApplicationStatus.DoesNotExist)。

所以,我的建议是:看看ApplicationStatus代码。