非常奇怪的rruleset行为

时间:2015-08-12 06:00:10

标签: python python-dateutil rrule

使用pip上可用的最新dateutil,在使用定期String[] names =new String[0]; 套件调用count方法时,我会遇到奇怪的时间和依赖于顺序的行为。

DAILY

1 个答案:

答案 0 :(得分:1)

答案很简单,因为你在创建规则集时没有包含dtstart参数,当没有包含它时,它默认为datetime.datetime.now(),这是当前时间,它包含组件达到目前的微秒。

因此,当您首次使用 -

创建规则集时
>>> rules = rrule.rruleset()
>>> rules.rrule(rrule.rrule(rrule.DAILY, until=datetime.datetime(2038,1,1,0,0,0)))
>>> rules.count()
8179

您从当前时间开始输入条目,最高可达微秒。

过了一段时间,当你再次尝试 -

rules.exrule(rrule.rrule(rrule.DAILY, until=datetime.datetime(2038,1,1,0,0,0)))

您将再次创建一个rrule.rrule对象,从当前时间开始,因此它与您在rules中创建的上一个对象不同。

要解决此问题,您可以指定dtstart属性以确保它同时启动。

示例 -

>>> rules = rrule.rruleset()
>>> rules.rrule(rrule.rrule(rrule.DAILY, until=datetime.datetime(2038,1,1,0,0,0), dtstart=datetime.datetime(now.year,now.month,now.day,0,0,0)))
>>> rules.count()
8179
>>> rules.exrule(rrule.rrule(rrule.DAILY, until=datetime.datetime(2038,1,1,0,0,0), dtstart=datetime.datetime(now.year,now.month,now.day,0,0,0)))
>>> l3 = list(rules)
>>> len(l3)
0
>>> rules.count()
0

在其他示例中也会出现类似的问题。

鉴于上述情况,我认为dateutil代码中存在一个问题,即当您第一次调用count()时,它们实际上会缓存规则集的计数(长度),然后只有在重新计算时才会重新计算其正确长度你迭代它等等。

问题出现在rrulebase类中,它是ruleset的基类。该代码是(来源 - https://github.com/dateutil/dateutil/blob/master/dateutil/rrule.py) -

def count(self):
    """ Returns the number of recurrences in this set. It will have go
        trough the whole recurrence, if this hasn't been done before. """
    if self._len is None:
        for x in self:
            pass
    return self._len

因此,即使在您之前调用exrule()后应用.count(),它也会继续给予相同的计数。

我不是百分之百确定它是否是一个错误,或者它是否有意这样的行为,很可能是一个错误。

我为此开了issue