gpt4 book ai didi

python - 非常奇怪的规则集行为

转载 作者:太空宇宙 更新时间:2023-11-04 05:46:44 25 4
gpt4 key购买 nike

使用 pip 上可用的最新 dateutil,在使用循环 DAILY 规则调用 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() ,这是当前时间,它包含直到当前微秒的组件。

因此,当您第一次使用 -

创建规则集时
>>> 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 的基类。其中的代码是 (source - 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

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

我不是 100% 确定它是否是一个错误,或者它是否打算那样做,很可能它是一个错误。

我打开了issue为此。

关于python - 非常奇怪的规则集行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31957080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com