比较datetime.datetime是否存在或None

时间:2010-07-03 07:08:33

标签: python google-app-engine

我正在使用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_datepast都是datetime.datetime。

我收到以下错误。

  

TypeError:无法将datetime.datetime与NoneType

进行比较

这样做的正确方法是什么?

3 个答案:

答案 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内置插件的名称在这个意义上是一种“有吸引力的滋扰”...... objfileobjectlistdictsetmin ...“文件”,“对象”,“列表”等所有显而易见的名称。但是,学会抵制是值得的这个特别的诱惑! - )

答案 2 :(得分:3)

您需要and,而不是or

您可能还想使用is None

修改

由于您已确定object.updated_date 不是 None,因此past 只有 { {1}}。