【发布时间】:2019-11-09 20:14:48
【问题描述】:
由于历史原因(阅读:可怕的type(t) == tuple 检查),我发现自己需要将圆形图冻结为tuple 对象的集合。显然,这并不理想:
>>> head = ("head", None)
>>> a = ("a", ("b", ("c", head)))
>>> head[1] = a
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
head[1] = a
TypeError: 'tuple' object does not support item assignment
然而,我并不是真正的 TypeErrors 的忠实信徒,我怀疑通过特定于实现的骇客技术可以做到这一点。
- 如何在不冒越界或导致其他 C 未定义行为的风险的情况下生成这种怪物?
- 垃圾收集器的循环依赖释放部分能否应对这种情况?
【问题讨论】:
-
显然有些人在 ctypes 上取得了成功(参见stackoverflow.com/q/6111843/674039),但它总是对我来说是段错误。而且我不知道
hash(a)应该如何为您的假设冻结圆形图存储在元组中工作,它可能会陷入无限循环。为什么不直接使用适当的图形库(例如 networkX),并在需要时定义图形/节点序列化器? -
@wim 为什么不直接使用
list?它实际上不是表示图形,而是表示状态图。这是一段糟糕的代码,应该被烧掉,但现在还不能。我正在将它切碎并尽可能将其送入熔炉。 (不过,您关于hash(a)的观点是有效的;这实际上可能无法实现,具体取决于代码使用tuple的用途。) -
哦,天哪。求求你,找一些其他可怕的黑客。
sed 's/type(t) == tuple/True/'怎么样? -
发挥创意。覆盖
type()和特殊情况下t的返回值。加油,我相信你。 -
@JohnKugelmansupportsMonica 上次我尝试修改
__builtins__,结果真的很糟糕。但我想它不会比这样做更更糟。实际上,将__builtins__.__dict__的类型动态修改为带有空__slots__的dict子类可能更安全,实现__getitem__并仅为可怕的模块替换type的实现……我想我已经在某个地方找到了那个代码。
标签: python-3.x tuples cpython circular-reference