python - 如何为 PyYAML 编写代表?

标签 python yaml pyyaml

我想要一个序列化任意 python 对象的自定义函数,比如 json.dump 函数如何有一个名为“默认”的可选 arg,如果对象不是 json 可序列化的,它应该是 json dumper 将调用的函数.

我只是想从 json 包中做同样的事情。

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

看起来我需要根据 PyYAML 文档编写 yaml.add_representer,但实际上并不清楚如何执行此操作。

最佳答案

这是 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__ 以获得可打印的表示形式,您可以使用它来填充 MyClass_representer 中的 serializedData

关于python - 如何为 PyYAML 编写代表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7183751/

相关文章:

python - PyYAML 错误 : Could not determine a constructor for the tag '!vault'

yaml - 如何在 ruamel.yaml 的旧版本(版本 <= 0.11)中使用代表

Python Pandas 在循环中创建新列

python - 通过循环创建二叉树

perl - 如何遍历嵌套数据结构中的数组?

c++ - Yaml-cpp 解析不起作用冒号后缺少空格

python - 不同的 YAML 数组表示

python - 烤宽面条 - 错误

python - 如何找到资源的坐标?

android - 为什么 Travis CI 会终止我脚本的进程?