2011-08-25 4 views
6

json.dump 함수에 'default'라는 옵션 arg가있는 것처럼 임의의 파이썬 개체를 직렬화하는 사용자 지정 함수가 있어야합니다.이 개체는 json serialum이 아닌 개체 인 경우 json dumper가 호출하는 함수 여야합니다.PyYAML에 대한 대입 연산자는 어떻게 작성합니까?

json 패키지에서 이와 동일한 작업을 수행하기 만하면됩니다. 나는 PyYAML 워드 프로세서에서, yaml.add_representer 작성해야처럼

json.dump(tests_dump, file('somefile', 'w+'), default = lambda x: x.__dict__) 

그것은 보이지만, 정말이 작업을 수행하는 방법을 명확하지 않다.

답변

3

다음은 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__을 구현하여 serializedDataMyClass_representer

+0

에 채울 수있는 인쇄 가능한 표현을 얻을 수 있습니다. 그러면 추가 된 표현식 및 생성자를 어떻게 등록 취소 할 수 있습니까? 나는 다른 행동에 의존하는 다른 도구가있는 환경에서 작업한다. 나는 yaml을 호출 한 코드가 다른 파일의 다른 파일에 있다고하더라도 이처럼 표현 자와 생성자를 추가하면 yaml 모듈의 동작이 변경된다는 것을 알았다. 기준 치수. – Shuman

+0

A (roor), B (root), C (root)와 같이 클래스 계층 구조에 대해이 작업을 수행하려면 어떻게해야합니까? –

관련 문제