1

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

测试这些方法,检查它们是否是彼此的“逆”方法,即调用另一个方法的结果并检查结果是否与原始输入等效。rrule这让我想到了一个问题:两个对象等价到底意味着什么?

最新版本dateutil.rrule2.6.0 似乎没有该类的__eq__方法rrule(参见源代码)。等价似乎也不像所有属性的等价一样微不足道,因为有时不同的freq参数仍会导致相同的重复出现。(例如,如果选择freq=DAILYfreq=WEEKLY导致相同的重复时间byweekday=FR;请参阅下面来自rrule.js 演示的屏幕截图)。

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

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

1

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

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

您的示例:“如果选择了 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

等等...

测试这些方法,检查它们是否是彼此的“逆”方法,即调用另一个方法的结果并检查结果是否与原始输入等效。

话虽如此,如果您的问题是关于测试的,我认为您走错了路。

只需采用规则,生成文本,解析文本并将新对象与原始对象进行比较,以确保它们是equals。为什么您需要为“等效”而烦恼?没有理由生成文本表示突然改变频率,是吗?

另一种方法是独立测试这两种方法,只承认“自然语言”表示是模糊的,两种方法不能严格互逆。取一组“规则=>文本版本”并测试生成。然后取另一个“文本版本=>规则”的数据集并测试解析器。

于 2016-12-03T15:05:16.463 回答