我需要设计一个支持某种不确定性(或者,如果需要的话,可以使用通配符)的对象。
该工作在Python中完成。

考虑以下课程

class C():
    def __init__(self, p1):
        self.p1 = p1


属性p1可以是“ x”,“ y”,“ z”,但有时可以是“ x或y”,或任何其他组合。

如果p1c1是'x'并且p1c2是'x或y',则c1 == c2将返回True。通过提供适当的__eq__功能很容易实现。
但是,这些对象也需要存储在集中,因此我需要提供一个__hash__函数。
在这种情况下,如c1 == c2然后hash(c1) == hash(c2),您将如何计算哈希函数?

选项1:对属性进行哈希处理

不好这就是为什么

c1 = C('x')
c2  = C('x or y or z')
c1 == c2 #True
hash(c1) == hash(c2)#False

最佳答案

您的平等标准不是可传递的,因此无效:

C('x') == C('x or y') == C('y')




C('x') != C('y')


由于您可以构造一个等于所有其他C('x or y or z or a or ...')的元素,因此唯一满足c1 == c2⇒hash(c1)== hash(c2)的哈希函数是一个常数。

def __hash__(self):
    return 0

关于python - 散列不确定对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6689935/

10-12 18:20