我正在使用python库simple-date。我通过初始化一个表示UTC日期的字符串创建了SimpleDate对象。当我尝试使用timedelta向其中添加天数时,它似乎可以正常工作,但是当我尝试打印时,它会无限递归。我检查了在调试器中用p加法得到的对象,它什么也不显示。类型为SimpleDate,但似乎不知何故为空。如果我不使用UTC字符串,则可以正常工作。
难道我做错了什么 ?
我的代码:
from simpledate import SimpleDate
from datetime import timedelta
# This works
day = '2016-06-01 00:00:00'
later = SimpleDate(day) + timedelta(days=10)
print(later)
# This works
day = '2016-06-01 00:00:00'
later = SimpleDate(day) + timedelta(days=10)
print(later)
# The print statement will cause infinite recursion
day = '2016-06-01 00:00:00'
later = SimpleDate(day, tz='UTC') + timedelta(days=10)
print(later)
# The print statement will cause infinite recursion
day = '2016-06-01 00:00:00UTC'
later = SimpleDate(day) + timedelta(days=10)
print(later)
最佳答案
因此,这里有两个问题。
第一个很容易解释。为特定错误生成消息会导致尝试报告相同的错误。这导致生成新消息,从而导致新错误,最终耗尽了堆栈。现在已解决。
第二个更难解释,因为时区很复杂。因此,我将首先给出一个更易于理解的示例。考虑PDT(太平洋夏令时间)中的以下日期:
>>> SimpleDate('2016-08-28',tz ='PDT')
SimpleDate('2016-08-28')
如果再加上6个月,我们将进入冬季。 PDT甚至不存在(现在是冬天)!所以我们得到一个错误:
>>> SimpleDate('2016-08-28',tz ='PDT')+ timedelta(天= 180)
simpledate.SingleInstantTzError:尝试使用PDT,仅针对2016-08-28 07:00:00 + 00:00定义
现在您可能会争辩说SimpleDate应该足够聪明才能知道PDT何时结束。但事实并非如此(而afaik它只是没有可用的数据,但我可能是错的)。而是,SimpleDate拒绝修改与可能具有有限有效性的时区关联的日期。这就是“瞬间”的意思。
有关更多信息,请参见the documentation。
但是在这种情况下,时区是UTC!我们知道这总是有效的。因此,我添加了一种特殊情况,可以在解析UTC时避免此限制:
>>> SimpleDate('2016-08-28',tz ='UTC')+ timedelta(天= 180)
SimpleDate('2017-02-24',tz ='UTC')
现在在PyPI中的版本为0.5.0。抱歉,延迟-一些测试失败了,我发现了一个新的错误,所以我需要做一些额外的工作。
关于python - 在从UTC创建的SimpleDate python对象中添加天数的无限递归,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39168209/