다음은 add_representer의 샘플입니다. 이것이 정확히 원하는 것인지 확실하지 않습니다. 그럼에도 불구하고 ...
import yaml
#Arbitrary Class
class MyClass:
def __init__(self, someNumber, someString):
self.var1 = someNumber
self.var2 = someString
#define the representer, responsible for serialization
def MyClass_representer(dumper, data):
serializedData = str(data.var1) + "|" + data.var2
return dumper.represent_scalar('!MyClass', serializedData)
#'register' it
yaml.add_representer(MyClass, MyClass_representer)
obj = MyClass(100,'test')
print ('original Object\nvar1:{0}, var2:{1}\n'.format(obj.var1, obj.var2))
#serialize
yamlData = yaml.dump(obj)
print('serialized as:\n{0}'.format(yamlData))
#Now to deserialize you need a constructor
def MyClass_constructor(loader,node):
value = loader.construct_scalar(node)
someNumber,sep,someString = value.partition("|")
return MyClass(someNumber,someString)
#'register' it
yaml.add_constructor('!MyClass', MyClass_constructor)
#deserialize
obj2 = yaml.load(yamlData)
print ('after deserialization\nvar1:{0}, var2:{1}\n'.format(obj2.var1, obj2.var2))
물론 코드 중복이 있으며 코드가 최적화되지 않았습니다. 이 두 함수를 클래스의 일부로 만들고 __repr__
을 구현하여 serializedData
을 MyClass_representer
에 채울 수있는 인쇄 가능한 표현을 얻을 수 있습니다. 그러면 추가 된 표현식 및 생성자를 어떻게 등록 취소 할 수 있습니까? 나는 다른 행동에 의존하는 다른 도구가있는 환경에서 작업한다. 나는 yaml을 호출 한 코드가 다른 파일의 다른 파일에 있다고하더라도 이처럼 표현 자와 생성자를 추가하면 yaml 모듈의 동작이 변경된다는 것을 알았다. 기준 치수. – Shuman
A (roor), B (root), C (root)와 같이 클래스 계층 구조에 대해이 작업을 수행하려면 어떻게해야합니까? –