我想知道如何在Python 2.7中评估无日期时间。
具体而言;
trial_exp_date < datetime.utcnow() #trial_exp_date = None
如果用户从未参加过试验,那么trial_exp_date将为None,在这种情况下,我想知道上述评估是否会评估为True of False。
答案 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 > None
或len <= len
之类的表达式不再有效,例如None < None
提升TypeError
而不是返回False
。一个必然结果是,对异构列表进行排序不再有意义 - 所有元素必须相互比较。请注意,这不适用于==
和!=
运算符:不同无比类型的对象总是相互比较不相等。
您可以使用明确的日期来解决此问题,您的逻辑应该使用该明确日期来表示未过期:(trial_exp_date or date_you_pick) < datetime.utcnow()
此日期的计算方式是将来总是在未来或者它是&#39 ;具体日期远在将来。第一次赢得了一百年的突破,但第二次,对我来说更明确/可读。由于Python中的order of precedence,你需要这些parantheses。