我将 Python 对象定义为“在任何深度都不可变”当且仅当
- 它(名义上)是不可变的; 和
- 如果它是一个“容器”对象,那么它只包含“在任何深度都不可变”的对象;
例如 ((1, 2), (3, 4))
在任何深度都是不可变的,而 ((1, 2), [3, 4])
不是(尽管后者由于是一个元组,“名义上”是不可变的)。
Is there a reasonable way to test whether a Python object is "immutable at any depth"?
测试第一个条件相对容易(例如使用 collections.Hashable
类,并忽略未正确实现的 __hash__
方法的可能性),但第二个条件条件更难测试,因为“容器”对象的异质性,以及迭代其“内容”的方法...
谢谢!
最佳答案
没有通用的不变性测试。仅当对象的任何方法都不能改变底层数据时,该对象才是不可变的。
更有可能的是,您对通常取决于不变性的可哈希性感兴趣。可散列的容器将递归散列其内容(即元组和卡住集)。因此,您的测试相当于运行 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'
关于python - 如何在 Python 中测试 "immutability-at-any-depth"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8275254/