与datetimes和relativedelta奇怪的算术

时间:2014-05-28 11:33:02

标签: python datetime python-dateutil relativedelta

relativedelta个对象相乘是否安全?我看到了一些奇怪且不一致的行为,并且无法记录这个类支持哪种算法(如果有的话)

>>> from datetime import datetime
>>> from dateutil.relativedelta import relativedelta
>>> datetime.now() + relativedelta(days=2)
datetime.datetime(2014, 5, 30, 12, 24, 59, 173941)
>>> datetime.now() + relativedelta(days=1) * 2
# TypeError: integer argument expected, got float

另一方面:

>>> relativedelta(days=2) == relativedelta(days=1) * 2
True

完整追溯(使用python 2.7.5和dateutil 1.5):

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/dateutil/relativedelta.py", line 261, in __radd__
    day = min(calendar.monthrange(year, month)[1],
  File "/usr/lib/python2.7/calendar.py", line 121, in monthrange
    day1 = weekday(year, month, 1)
  File "/usr/lib/python2.7/calendar.py", line 113, in weekday
    return datetime.date(year, month, day).weekday()
TypeError: integer argument expected, got float

1 个答案:

答案 0 :(得分:4)

自从修复以来,你遇到了known bug in relativedelta's handling of multiplication。它只影响Python 2.7或更新版本(某些函数的调用签名被收紧)。

将您的python-dateutils软件包升级到2.1或更高版本。

不要被2.0-is-Python-3关于项目文档的错误信息所拖延; 2.1和2.2是Python 2和3交叉兼容。