比较datetime.datetime是否存在或为None
我在Google App Engine上用Python运行一个小应用。在我的模型里,有一个叫做DateTimeProperty的属性,它的类型是datetime.datetime。创建时这个属性没有值(也就是说是“None”)。我想比较这个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进行比较
那我该怎么做才对呢?
3 个回答
也许你想表达的是:
if object.updated_date and object.updated_date >= past:
如果这个值是“真”的(也就是说它不是空值),我们还要检查它是否大于等于过去的时间。这种做法叫做短路评估,也就是说如果第一个条件是“假”的,第二个条件就不会被检查。
之前的讨论似乎已经确定了这两个变量可能都是 None
,所以一种处理方法是(假设你想在任一个变量为 None
时设置 object.updated_date
):
if None in (past, object.updated_date) or object.updated_date >= past:
object.updated_date = now
这里的重点是,检查 None in (past, object.updated_date)
可能比语义上等价的另一种写法 (past is None or object.update_date is None)
更方便(虽然后者因为更简洁可能更易读,但这其实是个风格上的争论)。
另外,我强烈建议不要用内置名称来命名你自己的变量(还有函数等)—— object
就是一个内置名称,在这个上下文中显然是被用作你自己的目的。用 obj
替代会更简洁,依然易读(可能更易读;-),而且没有任何坏处。虽然在某些情况下,你可能不会因为用自己的名字覆盖内置名称而“被咬”,但最终总会发生这种情况(比如在后续的维护操作中需要用到被覆盖的名称的正常含义),那时你可能会遇到困惑的调试情况;同时,你也可能会让其他读者或维护者感到困惑……而且这些坏处并没有带来任何好处。
我意识到很多Python的内置名称在这方面是个“诱人的干扰”…… file
、object
、list
、dict
、set
、min
、max
……这些名称看起来都很吸引人,像“一个文件”、“一个对象”、“一个列表”等等。但,学会抵制这种诱惑是很值得的!-)
你需要用 and
,而不是 or
。
你可能还想用 is None
。
编辑:
因为你已经确认 object.updated_date
不是 None
,那么唯一的其他可能就是 past
是 None
。