python - 如何在 Python 中测试 "immutability-at-any-depth"?

标签 python nested immutability hashable

我将 Python 对象定义为“在任何深度都不可变”当且仅当

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

例如 ((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/

相关文章:

python - 更新 App Engine 任务?

python - 提取每个终端节点的路径

ruby-on-rails - 在 Ruby 中查询 JSON 嵌套哈希响应时出现问题

java - 使对象不可变的可能方法

java - java中字符串混淆

python - 我可以将我的 python/ipython 输入/输出重定向到文本文件吗?

python - 将 JSON 模式转换为 python 类

python - 列表中的 L[L[3]] 是什么?

elasticsearch - 在 Elasticsearch 中更新嵌套对象

javascript - 如何将 "pointers"存储到 React/Javascript 中一棵不可变树中的嵌套节点?