我正在使用Python在Google App Engine上运行一个小应用程序。 在模型中,我有一个DateTimeProperty类型的属性,它是datetime.datetime。当它被创建时,没有值(即“无”)。 如果datetime.datetime为None,我想要比较,但我不能。
if object.updated_date is None or object.updated_date >= past:
object.updated_date = now
updated_date
和past
都是datetime.datetime。
我收到以下错误。
TypeError:无法将datetime.datetime与NoneType
进行比较
这样做的正确方法是什么?
答案 0 :(得分:6)
也许你的意思是:
if object.updated_date and object.updated_date >= past:
如果它是真实的(暗示不为空),我们检查它是也> =过去。这使用短路评估,这意味着如果第一个是假的,则不检查第二个条件。
答案 1 :(得分:6)
鉴于前面的讨论似乎已经确定任何一个变量都可以是None
,一种方法就是(假设你想在任一变量为{{1}时设置object.updated_date
}):
None
指出,支票if None in (past, object.updated_date) or object.updated_date >= past:
object.updated_date = now
可能比语义上等同的替代None in (past, object.updated_date)
更容易(可以说,由于其更好的紧凑性,epsilon更具可读性,但它当然是一种有争议的风格问题)。
顺便说一句,还有一个不那么有争议的风格问题;-),我强烈建议不要使用内置插件的名称作为你自己的变量(和函数等)的名称 - (past is None or object.update_date is None)
就是这样内置名称,在此上下文中明确用于您自己的目的。使用object
代替更简洁,仍然可读(可以说更多;-),并且没有缺点。你不可能在任何特定的情况下通过你自己的“阴影”内置插件的名称来实现“咬”,但最终会发生(因为你在某些时候碰巧需要阴影名称的正常含义)以后的普通维护操作)你可能会遇到混乱的调试情况;与此同时,你可能会使其他读者/维护者感到困惑......并且为了弥补这些不利因素而无法获得优势。
我意识到许多Python内置插件的名称在这个意义上是一种“有吸引力的滋扰”...... obj
,file
,object
,list
, dict
,set
,min
...“文件”,“对象”,“列表”等所有显而易见的名称。但是,学会抵制是值得的这个特别的诱惑! - )
答案 2 :(得分:3)
您需要and
,而不是or
。
您可能还想使用is None
。
修改强>
由于您已确定object.updated_date
不是 None
,因此past
只有 { {1}}。