Предположим, у меня есть класс 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 никогда не вызывает этогопользовательская загрузка.Есть ли другой способ вставить старый тег в процесс загрузки?