以下代码生成一个无限嵌套的 python 列表:
import yaml
i_list = yaml.load('&id1 [3, *id1]')
print i_list
# [3, [...]]
print i_list[1] is i_list
# True
我还可以明确提及 pythonlist
类型:
i_list = yaml.load('&id1 !!python/list [3, *id1]')
而且我也可以在不解析yaml的情况下手动创建该结构,如下:
i_list = [3]
i_list.append(i_list)
但是,最后一个技巧不适用于元组或任何其他不可变对象。要创建一个无限嵌套的元组,我必须使用 CPython 的 API:
from ctypes import pythonapi
from _ctypes import PyObj_FromPtr
t = pythonapi.PyTuple_New(1)
pythonapi.PyTuple_SetItem(t, 0, t)
i_tup = PyObj_FromPtr(t)
print repr(i_tup)
# ((...),)
这种元组的预期 yaml 代码如下所示:
&id001 !!python/tuple
- *id001
确实,这是 的输出yaml.dump(i_tup)
。但是,python 的 yaml 无法加载完全相同的代码:
yaml.load(yaml.dump(i_tup))
ConstructorError: found unconstructable recursive node
in "<string>", line 1, column 1:
&id001 !!python/tuple
^
有什么好的理由吗?您可以建议任何解决方法吗?