【发布时间】:2019-11-17 19:36:53
【问题描述】:
假设我有一个类MyClass 驻留在包my_package 中。将此类数据转储到 YAML 可能会产生:
!!python/object:my_package.MyClass
my_field_1: "foo"
my_field_2: "bar"
这个数据可以用默认的加载器反序列化就好了。但是我们如何处理重构包/类名呢?例如,如果我们将包重命名为 my_new_package,代码无法像预期的那样反序列化现有的 YAML 文件:
yaml.constructor.ConstructorError: while constructing a Python object
cannot find 'MyClass' in the module 'my_package'
如何向 YAML 加载器添加向后兼容性,以便仍然可以加载旧数据?
我的第一次尝试是自定义加载器并注册旧标签名称以实现向后兼容性:
class CustomLoader(yaml.SafeLoader):
pass
def my_class_loader(loader, node):
# to be implemented
CustomLoader.add_constructor("!!python/object:my_package.MyClass", my_class_loader)
data = yaml.load(f, Loader=CustomLoader)
不幸的是,PyYaml 从未调用此自定义加载。有没有其他方法可以将旧标签注入到加载过程中?
【问题讨论】: