Python在其中一个datetime为None时计算datetimes



我想知道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 > Nonelen <= len这样的表达式不再有效,例如None < None引发TypeError而不是返回False。一个推论是,对异构列表进行排序不再有意义——所有元素必须彼此比较。注意,这不适用于==!=操作符:不同不可比较类型的对象总是彼此不相等比较。

你可以用一个明确的日期来解决这个问题,你的逻辑应该用它来表示未过期:(trial_exp_date or date_you_pick) < datetime.utcnow()这个日期的计算方式是它总是在未来,或者它是一个遥远的未来的特定日期。前者一百年也不会破,但后者对我来说更明确/可读。根据Python的优先顺序,您需要使用括号

相关内容

  • 没有找到相关文章

最新更新