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

Implementation of an equivalence relation for recurrence rules (rrules)

我正在研究如何实现类似于 rrule.js; however, I'd like to implement it in Python building on dateutil.rruletoText()fromText() 方法的重复规则的人性化文本表示。

测试此类方法以检查它们是否是彼此的 'inverse',即调用一个方法另一个的结果并检查结果是否与原始输入相同。这让我想到了一个问题:两个 rrule 对象等价究竟意味着什么?

dateutil.rrule 的最新版本 2.6.0 似乎没有针对 rrule class 的 __eq__ 方法(参见 source code). Equivalence also does not seem to be as trivial as equivalence of all attributes, because sometimes a different freq parameter can still lead to the same recurrences. (For example, freq=DAILY and freq=WEEKLY leads to the same recurrence times if byweekday=FR is chosen; see screen grabs below from the rrule.js demo ).

有人知道规则的等价关系的实现吗? (它不必在 Python 中)。

Does anyone know of an implementation of an equivalence relation for rrules? (It doesn't have to be in Python).

不,因为据我所知不可能有可靠的东西。对于有限规则(使用 COUNT 或 UNTIL),您可以比较它们的出现集——如果这两个集相同,它们将是 "equivalent"。但是你不能为无限规则这样做。

您的示例:“如果选择 byweekday=FR,freq=DAILY 和 freq=WEEKLY 会导致相同的重复时间”并不总是正确的,不能一概而论。例如,改变频率。

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

等等...

Testing such methods checking that they are each other's 'inverse', that is, calling one on the result of the other and checking that the result is equivalent to the original input.

也就是说,如果你的问题是关于测试的,我认为你走错了路。

只需取一个规则,生成文本,解析文本并将新对象与原始对象进行比较,确保它们等于。为什么你需要为 "equivalent" 操心?没有理由生成文本表示突然改变频率,是吗?

另一种方法是独立测试这两种方法,承认"natural language"表示是模糊的,这两种方法不能严格相互反演。取一组"rule => text version"的数据集,测试生成。然后取另一个数据集 "text version => rule" 并测试解析器。