gpt4 book ai didi

python - 让 __eq__ 引发异常的陷阱?

转载 作者:行者123 更新时间:2023-11-28 17:32:24 24 4
gpt4 key购买 nike

我有一个类型,其中相等比较没有意义。明确比较此类型的两个实例的引用或值相等性将指示调用代码中的逻辑错误。

定义 __eq__ 引发异常是不是很糟糕?这有什么陷阱吗?它是否作为某些常见操作的一部分被隐式调用?

在像 Haskell 这样的语言中,我不会简单地实现 Equal 类型类,并且尝试比较将是一个编译错误。由于 python 是完全动态的,如果这个定义不是一个好主意,我是否有一个选项可以帮助鼓励正确使用?

我可以返回 NotImplemented,但如果 R​​HS 也返回 NotImplemented,它会进行回退比较,最终会导致身份比较,但我仍然不想那个。

最佳答案

使 __eq__ throw 将阻止您的类被用作字典中的键。字典是将任意值“附加”到引用可比较对象的常用方法。

例如:

class NotComparableAtAll:
def __eq__(self, other):
raise ValueError ('haha')

cache = { }
x, y = NotComparableAtAll (), NotComparableAtAll ()

cache[x] = 1
cache[y] = 2

这失败了,表示该类型不可散列。

但是,如果您确实将 __hash__ 添加到类中(默认值会在您定义 __eq__ 后立即删除),示例出现几乎所有时间都可以正常工作,只有当两个不同的对象在某台机器上具有相同的哈希值时,它才会出乎意料地失败。要重现它,请将 __hash__ 定义为始终返回 0(这确实符合 __hash__ 要求)。

此外,像这样重写 __eq__ 会破坏一些标准函数,在这些函数中,通过引用进行比较很有用:

my_list = [x, y]
my_list.remove (y)

这当然可以被视为“这些对象真的不能被比较”的另一种情况,但我想人们可以想出其他类似的例子,其中比较以某种方式嵌套在不同的有用操作中。

关于python - 让 __eq__ 引发异常的陷阱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33415743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com