如何在Python中创建一个不变的词典吗?(How to create an immutable d

2019-09-18 02:08发布

我想subclass dict在Python这样子类的所有词典是不可改变的。

我不明白怎么做__hash__影响不变性,因为在我的理解,它只是意味着平等或对象的非平等

因此,可以__hash__被用来实现不变性? 怎么样 ?

更新

目标是,从API常见的反应可作为一个字典,其具有作为一个全局变量被共享。 因此,需要保持完整不管是什么?

Answer 1:

我发现了一个官方的参考:

class imdict(dict):
    def __hash__(self):
        return id(self)

    def _immutable(self, *args, **kws):
        raise TypeError('object is immutable')

    __setitem__ = _immutable
    __delitem__ = _immutable
    clear       = _immutable
    update      = _immutable
    setdefault  = _immutable
    pop         = _immutable
    popitem     = _immutable

署名: http://www.python.org/dev/peps/pep-0351/



Answer 2:

因此,可以__hash__被用来实现不变性?

不,不能。 该目的可以由可变(或不)不管其是什么__hash__方法一样。

不可改变的对象之间的关系__hash__是,由于一个不可变的对象不能被改变,由返回的值__hash__保持恒定后施工。 对于可变对象,这可能会或可能不是这种情况(推荐的做法是这样的对象简单地失败散列)。

如需进一步讨论,请参见发行13707:明确hash() constency时期 。



Answer 3:

关于hashability和可变性之间的关系:

为了有用,散列实现需要满足以下特性:

  1. 是比较使用相等的两个对象的散列值==必须相等。

  2. 哈希值可能不随时间而改变。

这两个属性意味着比较实例时,哈希的类不能采取可变的特性考虑,并通过对位的是里面做类采取可变属性考虑在内时,比较实例不是可哈希。 一成不变的类可以制成可哈希不作比较没有任何影响。

所有内置可变类型的不是可哈希,所有的不可变的内置类型是可哈希。 这主要是上述意见的结果。

用户定义的类默认基于对象标识定义进行比较,并使用id()为哈希。 他们是可变的,但比较情况下,当可变数据没有考虑到,这样他们就可以进行哈希的。

使类可哈希不让它在一些神奇的方式不变。 相反,做一个字典可哈希以合理的方式,同时保持原有的比较操作,您首先需要使它不变。

编辑 :关于你提到的更新:

有几种方法,以提供全球不可改变字典相当于:

  1. 使用collections.namedtuple()的实例来代替。

  2. 使用具有只读属性的用户定义的类。

  3. 我通常像这样的东西去:

     _my_global_dict = {"a": 42, "b": 7} def request_value(key): return _my_global_dict[key] 

    通过领先的下划线,你清楚地表明_my_global_dict是一个实现细节不被应用程序代码被感动。 请注意,此代码将仍然允许,如果他们碰巧是可变对象修改字典中的 。 你可以解决通过返回这个问题copy.copy() S或copy.deepcopy()如有必要,S中的值。



文章来源: How to create an immutable dictionary in python?