实现递归规则的等价关系(rrules)

时间:2016-12-02 16:52:08

标签: python equivalence rrule

我正在研究如何实现类似于rrule.jstoText()fromText()方法的重复规则的人性化文本表示;但是,我想在dateutil.rrule的Python构建中实现它。

测试这些方法,检查它们是否是彼此反向的,即,在另一个的结果上调用一个并检查结果是否等同于原始输入。这让我想到了这样一个问题:两个rrule对象的等价是什么意思?

最新版本的dateutil.rrule 2.6.0似乎没有__eq__类的rrule方法(请参阅source code)。等价似乎也不像所有属性的等价一样微不足道,因为有时不同的freq参数仍然会导致相同的重复。 (例如,如果选择freq=DAILY,则freq=WEEKLYbyweekday=FR会导致相同的重复发生时间;请参阅rrule.js demo下方的屏幕抓取。

有没有人知道rrules的等价关系的实现? (它不一定要用Python)。

enter image description here

enter image description here

1 个答案:

答案 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 =>规则”数据集并测试解析器。