Модуль PyYAML позволяет выгружать/сохранять экземпляры пользовательских классов Python в поток YAML.
import yaml class Person(): def __init__(self, name, age): self.name = name self.age = age def __repr__(self): return f"{self.__class__.__name__}(name={self.name}, age={self.age})" # Создадим объект класса Person() person = Person('Jessa', 28) # сохраняем объект класса Person() в YAML yaml_obj = yaml.dump(person) print(yaml_obj) # !!python/object:__main__.Person # age: 28 # name: Jessa # Десериализация YAML в пользовательский класс Python new_person = yaml.load(yaml_obj, Loader=yaml.Loader) print(new_person) # Person(name=Jessa, age=28) print(new_person.name, new_person.age) # Jessa 28
Можно определить свои собственные теги для документа YAML для конкретного приложения. Самый простой способ сделать это - определить подкласс yaml.YAMLObject
. Yaml.YAMLObject
использует магию метакласса для регистрации конструктора, который преобразует узел YAML в экземпляр класса, и представителя, который сериализует экземпляр класса в узел YAML.
Например:
import yaml # класс какого то приложения class Monster(yaml.YAMLObject): # определяем собственный YAML тег yaml_tag = '!Monster' def __init__(self, name, hp, ac, attacks): self.name = name self.hp = hp self.ac = ac self.attacks = attacks def __repr__(self): return (f"{self.__class__.__name__}(name={self.name}," f" hp={self.hp}, ac={self.ac}, attacks={self.attacks})") # создаем объект класса Monster() monster1 = Monster(name='Spider', hp=[2, 6], ac=16, attacks=['BITE', 'HURT']) # сохраняем экземпляр `Monster()` в YAML yaml_obj = yaml.dump(monster1) # смотрим print(yaml_obj) # !Monster # ac: 16 # attacks: # - BITE # - HURT # hp: # - 2 # - 6 # name: Spider # Десериализация YAML в новый экземпляр класса monster2 = yaml.load(yaml_obj, Loader=yaml.Loader) # объект monster2 print(monster2) # Monster(name=Spider, hp=[2, 6], ac=16, attacks=['BITE', 'HURT']) # объект monster1 print(monster1) # Monster(name=Spider, hp=[2, 6], ac=16, attacks=['BITE', 'HURT'])
Более подробнее о функции yaml.dump()
и ее параметрах смотрите в разделе "Запись/сериализация различных типов Python в файл YAML"
Так же читайте про безопасную загрузку объектов Python из документа YAML, полученного из ненадежного источника.