我正在研究如何实现类似于rrule.js的toText()
和fromText()
方法的重复规则的人性化文本表示;但是,我想在dateutil.rrule的Python构建中实现它。
测试这些方法,检查它们是否是彼此反向的,即,在另一个的结果上调用一个并检查结果是否等同于原始输入。这让我想到了这样一个问题:两个rrule
对象的等价是什么意思?
最新版本的dateutil.rrule
2.6.0似乎没有__eq__
类的rrule
方法(请参阅source code)。等价似乎也不像所有属性的等价一样微不足道,因为有时不同的freq
参数仍然会导致相同的重复。 (例如,如果选择freq=DAILY
,则freq=WEEKLY
和byweekday=FR
会导致相同的重复发生时间;请参阅rrule.js demo下方的屏幕抓取。
有没有人知道rrules的等价关系的实现? (它不一定要用Python)。
答案 0 :(得分:1)
有没有人知道rrules的等价关系的实现? (它不一定是Python)。
不,因为据我所知,不可能有可靠的东西。对于有限规则(使用COUNT或UNTIL),您可以比较它们的出现集 - 如果两个集相同,它们将是“等效的”。但你无法做到无限规则。
您的示例:“ freq = DAILY和freq = WEEKLY会导致相同的重复次数,如果byweekday = FR被选中”并非总是如此且无法推广。例如,更改频率。
FREQ=DAILY;BYDAY=FR;INTERVAL=2
FREQ=WEEKLY;BYDAY=FR;INTERVAL=2
或者在“byweekday”添加更多天数并与BYSETPOS结合使用。
FREQ=DAILY;BYDAY=MO,FR;BYSETPOS=-1
FREQ=WEEKLY;BYDAY=MO,FR;BYSETPOS=-1
等等......
测试这样的方法,检查它们是彼此的'逆',即在另一个的结果上调用一个并检查结果是否等于原始输入。
所以说,如果你的问题是关于测试,我认为你走错了路。
只需要制定规则,生成文本,解析文本并将新对象与原始对象进行比较,以确保它们是等于。为什么你需要打扰“等价”?生成文本表示没有理由突然改变频率,是吗?
另一种方法是独立地测试这两种方法,并且只承认“自然语言”表示是模糊的,并且这两种方法不能严格地相互反转。取一个“rule => text version”数据集并测试生成。然后采用另一个“text version =>规则”数据集并测试解析器。