我正在研究如何实现类似于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中的屏幕抓图)。

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

python - 实现重复规则(规则)的等价关系-LMLPHP

python - 实现重复规则(规则)的等价关系-LMLPHP

最佳答案

有谁知道规则的等价关系的实现? (它不必在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/

10-16 04:18