比较datetime.datetime是否存在或为None

9 投票
3 回答
43938 浏览
提问于 2025-04-16 00:46

我在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_datepast都是datetime.datetime类型的。

我遇到了以下错误。

TypeError: 不能将datetime.datetime与NoneType进行比较

那我该怎么做才对呢?

3 个回答

6

也许你想表达的是:

if object.updated_date and object.updated_date >= past:

如果这个值是“真”的(也就是说它不是空值),我们还要检查它是否大于等于过去的时间。这种做法叫做短路评估,也就是说如果第一个条件是“假”的,第二个条件就不会被检查。

8

之前的讨论似乎已经确定了这两个变量可能都是 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的内置名称在这方面是个“诱人的干扰”…… fileobjectlistdictsetminmax……这些名称看起来都很吸引人,像“一个文件”、“一个对象”、“一个列表”等等。但,学会抵制这种诱惑是很值得的!-)

3

你需要用 and,而不是 or

你可能还想用 is None

编辑:

因为你已经确认 object.updated_date 不是 None,那么唯一的其他可能就是 past None

撰写回答