【发布时间】:2012-07-03 18:13:17
【问题描述】:
我在和我的一个同事争论,是否所有的 Python 类都真的需要是可散列的。我们有一个包含符号表达式的类(类似于 SymPy)。
我的论点是,由于我们无法比较两个表达式是否相等,因此不应允许散列。例如,表达式 '(x)' 和 '(1*x)' 可能比较相等,而 'sqrt(x*x*x)' 和 'abs(x)*sqrt(x)' 可能不相等。因此,当使用符号表达式调用时,'hash()' 应该会引发错误。
他的论点是您应该能够将所有类用作字典和集合中的键。因此,它们也必须是可散列的。 (我现在把话放在他嘴里,他会解释得更好。)。
谁是对的?如果您尝试对它们进行哈希处理,是否有抛出错误的类?
【问题讨论】:
-
相等运算符似乎是必不可少的。实际上,我确实重载了相等运算符。但是,例如调用 'x==1' 不会返回布尔值,而是返回 表达式 'x==1'。
-
这个东西说起来很麻烦,因为所讨论的类代表符号表达式。
-
我希望 '==' 和类似的运算符与哈希一致,并在 python 绑定中使用其他运算符来组合两个子表达式和测试操作。
-
__eq__()返回的表达式能否在布尔上下文中进行有意义的评估?if exp1 == exp2有效吗?如果没有,定义__hash__()是没用的。 -
您是否有一个特定的用例来使表达式
'(x)'和'(1*x)'比较相等,或者只是一个通用的想法,它会很有用?