我正在寻找一些合理的方法来使用 PyYAML 序列化 YAML 中的命名元组。
一些我不想做的事情:
在命名元组的实例化时,依靠动态调用来添加构造函数/表示器/解析器。这些 YAML 文件可能会在以后存储和重新加载,因此我不能依赖于它们恢复时存在的相同运行时环境。
在全局中注册命名元组。
依赖具有唯一名称的命名元组
我在想一些事情:
class namedtuple(object):
def __new__(cls, *args, **kwargs):
x = collections.namedtuple(*args, **kwargs)
class New(x):
def __getstate__(self):
return {
"name": self.__class__.__name__,
"_fields": self._fields,
"values": self._asdict().values()
}
return New
def namedtuple_constructor(loader, node):
import IPython; IPython.embed()
value = loader.construct_scalar(node)
import re
pattern = re.compile(r'!!python/object/new:myapp.util\.')
yaml.add_implicit_resolver(u'!!myapp.util.namedtuple', pattern)
yaml.add_constructor(u'!!myapp.util.namedtuple', namedtuple_constructor)
假设这是在路径 myapp/util.py 的应用程序模块中
但是,当我尝试加载时,我没有进入构造函数:
from myapp.util import namedtuple
x = namedtuple('test', ['a', 'b'])
t = x(1,2)
dump = yaml.dump(t)
load = yaml.load(dump)
它将无法在 myapp.util 中找到 New。
我也尝试了各种其他方法,这只是我认为可能效果最好的一种。
免责声明:即使我进入了正确的构造函数,我也知道我的规范需要进一步的工作来了解保存哪些参数如何将它们传递到结果对象中,但对我来说,第一步是将 YAML 表示形式放入我的构造函数中,那么其余的应该很容易。