我正在研究如何实现类似于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中的屏幕抓图)。
有谁知道规则的等价关系的实现? (它不必在Python中)。
最佳答案
有谁知道规则的等价关系的实现? (它不必在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
等等...
测试这样的方法,以检查它们是否彼此相反,即,对另一方法的结果进行调用,并检查结果是否等于原始输入。
话虽这么说,如果您的问题是关于测试的,我认为您走错了路。
只需遵循一条规则,生成文本,解析文本,然后将新对象与原始对象进行比较以确保它们相等即可。为什么您需要打扰“等效”?没有理由生成文本表示形式时突然改变频率,是吗?
另一种方法是独立测试这两种方法,只承认“自然语言”表示是模糊的,并且这两种方法不能严格地彼此相反。取一个“规则=>文本版本”数据集并测试其生成。然后获取“文本版本=>规则”的另一个数据集并测试解析器。
关于python - 实现重复规则(规则)的等价关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40937237/