我有一个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属性吗?
答案 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代码。