如何在Python中测试"任何深度的不变性"?

kjo*_*kjo 9 python nested immutability hashable

我将Python对象定义为"在任何深度都是不可变的"iff

  1. 它(名义上)是不可改变的;
  2. 如果它是一个"容器"对象,那么它只包含"在任何深度都是不可变的"对象;

例如((1, 2), (3, 4)),在任何深度都是不可变的,而((1, 2), [3, 4])不是(尽管后者,由于是一个元组,"名义上"是不可变的).

有没有合理的方法来测试Python对象是否"在任何深度都是不可变的"?

测试第一个条件相对容易(例如使用collections.Hashable类,忽略了不正确实现__hash__方法的可能性),但第二个条件更难以测试,因为"容器"对象的异质性,以及迭代他们的"内容"......

谢谢!

Ray*_*ger 5

对不变性没有一般性测试.仅当对象的任何方法都不能改变基础数据时,对象才是不可变的.

更有可能的是,你对可靠性感兴趣,这通常取决于不变性.可清除的容器将递归地散列其内容(即元组和后代).所以,你的测试相当于运行hash(obj),如果它成功,那么它是可以深度清洗​​的.

IOW,您的代码已经使用了最好的测试:

>>> a = ((1, 2), (3, 4))
>>> b = ((1, 2), [3, 4])
>>> hash(a)
5879964472677921951
>>> hash(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)