当一个日期时间为无时,Python会评估日期时间

时间:2015-07-09 14:52:51

标签: python-2.7 datetime

我想知道如何在Python 2.7中评估无日期时间。

具体而言;

trial_exp_date < datetime.utcnow() #trial_exp_date = None

如果用户从未参加过试验,那么trial_exp_date将为None,在这种情况下,我想知道上述评估是否会评估为True of False。

2 个答案:

答案 0 :(得分:1)

你总是可以在python解释器中试一试。

from datetime import datetime
None < datetime.utcnow()

这给出了一个TypeError。这样做的原因是因为datetime模块没有datetime对象和None之间的比较概念。您可以通过事先检查来判断trial_exp_date是否为None,如果是这样做,则可以处理此事,即:

if trial_exp_date is not None:
    return trial_exp_date < datetime.utcnow()
else:
    # handle the case where the user never was on a trial

答案 1 :(得分:1)

在Python 2中,None最初总是少于任何数据类型(see code for cpython)在第779行,您会看到/* None is smaller than anything */后跟评估代码。但是,似乎这是在Python 2.7(与你相关)的情况下重新移植的。如果你看Data Types,你会看到:

  

在2.7版中更改:复杂类型不再对__coerce__()方法进行混合类型二进制算术运算的隐式调用。

虽然 2.6 文档令人困惑,因为it says

  

永远不会强迫进行丰富的比较方法。

最后,您应该检查它。

Python 3(see what's new)肯定会发生变化,而不是抛出类型错误:

  

Python 3.0简化了排序比较的规则:

     

当操作数没有有意义的自然时,排序比较运算符(<<=>=>)会引发TypeError异常排序。因此,诸如1 < ''0 > Nonelen <= len之类的表达式不再有效,例如None < None提升TypeError而不是返回False。一个必然结果是,对异构列表进行排序不再有意义 - 所有元素必须相互比较。请注意,这不适用于==!=运算符:不同无比类型的对象总是相互比较不相等。

您可以使用明确的日期来解决此问题,您的逻辑应该使用该明确日期来表示未过期:(trial_exp_date or date_you_pick) < datetime.utcnow()此日期的计算方式是将来总是在未来或者它是&#39 ;具体日期远在将来。第一次赢得了一百年的突破,但第二次,对我来说更明确/可读。由于Python中的order of precedence,你需要这些parantheses。