Python __eq__ 中是否需要传递性?

原文标题Is there a need for transitivity in Python __eq__?

我正在使用自定义__eq__实现我自己的课程。而且我想返回True对于数学意义上不“相等”但以模糊方式“匹配”的事物。

然而,一个问题是,这会导致数学意义上的传递性丧失,即a == b && b ==c,而a可能不等于c

问题:Python 是否依赖于__eq__是可传递的?我正在尝试做的事情是否会破坏事物,或者只要我自己小心不要假设传递性,是否有可能做到这一点?

用例

我想将电话号码相互匹配,而这些电话号码可能是国际格式,或者仅供国内使用(未指定国家代码)。如果没有指定国家代码,我希望一个数字等于一个数字,但如果指定,它应该只等于具有相同国家代码的数字,或者没有一个。

所以:

  • 当然, +31 6 12345678 应该等于 +31 6 1234567 ,并且 06 12345678 应该等于 06 12345678
  • +31 6 12345678 应该等于 06 12345678(和 v.v.)
  • +49 6 12345678 应该等于 06 12345678(和 v.v.)
  • 但是 +31 6 12345678 不应该等于 +49 6 12345678

编辑:我不需要散列(因此不会实现它),这样至少让生活更轻松。

原文链接:https://stackoverflow.com//questions/71465820/is-there-a-need-for-transitivity-in-python-eq

回复

我来回复
  • MisterMiyagi的头像
    MisterMiyagi 评论

    没有必须,但应该有一个比较关系与通常理解的关系一致。但是,Python 明确地不强制执行这一点,并且float是一种具有不同行为的内置类型,因为float("nan")

    表达式:值比较

    […]
    如果可能,自定义比较行为的用户定义类应遵循一些一致性规则:

    • […]
    • 比较应该是可传递的。以下(非详尽的)示例说明:
    • x > y 和 y > z 意味着 x > z
    • x < y 和 y <= z 意味着 x < z

    Python 不强制执行这些一致性规则。事实上,非数字值就是不遵守这些规则的一个例子。

    2年前 0条评论