使用pip上最新的dateutil,当使用一个循环的DAILY
rrule调用count
方法时,我得到了奇怪的时间和顺序依赖行为。在
>>> import dateutil
>>> dateutil.__version__
'2.4.2'
>>> from dateutil import rrule
>>> import datetime
>>> 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)))
>>> rules.count()
8179 # ??? Expected 0
>>> rules = rrule.rruleset()
>>> rules.exrule(rrule.rrule(rrule.DAILY, until=datetime.datetime(2038,1,1,0,0,0)))
>>> rules.rrule(rrule.rrule(rrule.DAILY, until=datetime.datetime(2038,1,1,0,0,0)))
>>> rules.count()
8179 # ??? Expected 0
>>> rules = rrule.rruleset()
>>> rules.exrule(rrule.rrule(rrule.DAILY, until=datetime.datetime(2038,1,1,0,0,0)))
>>> rules.count()
0
>>> rules.rrule(rrule.rrule(rrule.DAILY, until=datetime.datetime(2038,1,1,0,0,0)))
>>> rules.count()
0 # Now its working???
>>> rules = rrule.rruleset()
>>> rules.exrule(rrule.rrule(rrule.DAILY, until=datetime.datetime(2038,1,1,0,0,0)))
>>> rules.rrule(rrule.rrule(rrule.DAILY, until=datetime.datetime(2038,1,1,0,0,0)))
>>> rules.count()
8179 # ??? Expected 0
>>> rules = rrule.rruleset()
>>> rules.count()
0
>>> rules.rrule(rrule.rrule(rrule.DAILY, until=datetime.datetime(2038,1,1,0,0,0)))
>>> rules.count()
0 # WHAT???
>>> rules.count()
0
>>> rules = rrule.rruleset()
>>> rules.rrule(rrule.rrule(rrule.DAILY, until=datetime.datetime(2038,1,1,0,0,0)))
>>> rules.count()
8179 # IM DONE... WTF
答案很简单,这是因为在创建规则集时没有包含
dtstart
参数,当不包括该参数时,它默认为datetime.datetime.now()
,即当前时间,它包含的组件高达当前微秒。在因此,当您第一次使用-
你可以从当前时间开始获取条目,最高可达微秒。在
过了一段时间,当你再次尝试-
^{pr2}$您再次创建了一个
rrule.rrule
对象,从当前时间开始,因此它与您在rules
中创建的前一个对象不同。在要解决此问题,可以指定
dtstart
属性以确保它同时启动。在示例-
类似的问题在其他例子中也会出现。在
考虑到上面的情况,我认为dateutil代码中存在一个问题,当您第一次调用
count()
时,它们实际上缓存了规则集的计数(长度),然后只有当您迭代它时才重新计算它的正确长度,等等问题发生在
rrulebase
类中,该类是ruleset
的基类。其中的代码是(source-https://github.com/dateutil/dateutil/blob/master/dateutil/rrule.py)-因此,即使在应用
exrule()
之后,如果您以前调用了.count()
,它仍然会返回相同的计数。在我不能百分之百地确定它是一个bug还是它打算这样做,很可能是一个bug。在
我已经为此打开了issue。在
相关问题 更多 >
编程相关推荐