我想知道Python 2.7中None datetime是如何计算的。
明确;
trial_exp_date < datetime.utcnow() #trial_exp_date = None
如果用户从未试用过,则trial_exp_date将为None,在这种情况下,我想知道上述评估是否会评估为True或False。
您可以在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
在Python 2中,None最初总是小于任何数据类型(参见cpython的代码)在第779行,您看到/* None is smaller than anything */
后面跟着求值代码。然而,在Python 2.7的情况下(与您相关),这似乎是向后移植的。如果查看数据类型,可以看到:
在2.7版更改:复杂类型不再隐式调用
__coerce__()
方法进行混合类型二进制算术运算。
虽然,2.6文档是令人困惑的,因为它说:
富比较方法的参数永远不会被强制。
最后,您应该检查它是否存在
在Python 3中肯定会有变化(看看有什么新的),它会抛出类型错误:
Python 3.0简化了排序比较的规则:
排序比较操作符(
<
,<=
,>=
,>
)在操作数不具有有意义的自然排序时引发TypeError
异常。因此,像:1 < ''
,0 > None
或len <= len
这样的表达式不再有效,例如None < None
引发TypeError
而不是返回False
。一个推论是,对异构列表进行排序不再有意义——所有元素必须彼此比较。注意,这不适用于==
和!=
操作符:不同不可比较类型的对象总是彼此不相等比较。
你可以用一个明确的日期来解决这个问题,你的逻辑应该用它来表示未过期:(trial_exp_date or date_you_pick) < datetime.utcnow()
这个日期的计算方式是它总是在未来,或者它是一个遥远的未来的特定日期。前者一百年也不会破,但后者对我来说更明确/可读。根据Python的优先顺序,您需要使用括号