【发布时间】:2019-06-20 01:15:30
【问题描述】:
我正在使用 python 库中的函数,该函数返回具有特定数据类型的对象。我想将该对象序列化为一个 yaml 文件,并且我想使用ruamel.yaml。问题是ruamel.yaml不知道如何序列化函数返回的具体数据类型并抛出异常:
RepresenterError: cannot represent an object: <...>
问题是如何将数据类型“声明”为ruamel.yaml,以便它知道如何处理它。
注意:我不能/我不想对库或任何类似的东西进行更改。我只是一个 API 的消费者。
为了更具体,让我们使用下面的例子,它使用了socket.AF_INET,它恰好是一个IntEnum,但具体的数据类型应该不重要。
import sys
import socket
import ruamel.yaml
def third_party_lib():
""" Return a dict with our data """
return {"AF_INET": socket.AF_INET}
yaml = ruamel.yaml.YAML(typ="safe", pure=True)
yaml.dump(third_party_lib(), sys.stdout)
这给出了这个错误:
ruamel.yaml.YAML.dump(self, data, stream, **kw)
File "/home/feanor/Prog/git/vps-bench/.direnv/python-venv-3.7.2/lib/python3.7/site-packages/ruamel/yaml/main.py", line 439, in dump
return self.dump_all([data], stream, _kw, transform=transform)
File "/home/feanor/Prog/git/vps-bench/.direnv/python-venv-3.7.2/lib/python3.7/site-packages/ruamel/yaml/main.py", line 453, in dump_all
self._context_manager.dump(data)
File "/home/feanor/Prog/git/vps-bench/.direnv/python-venv-3.7.2/lib/python3.7/site-packages/ruamel/yaml/main.py", line 801, in dump
self._yaml.representer.represent(data)
File "/home/feanor/Prog/git/vps-bench/.direnv/python-venv-3.7.2/lib/python3.7/site-packages/ruamel/yaml/representer.py", line 84, in represent
node = self.represent_data(data)
File "/home/feanor/Prog/git/vps-bench/.direnv/python-venv-3.7.2/lib/python3.7/site-packages/ruamel/yaml/representer.py", line 111, in represent_data
node = self.yaml_representers[data_types[0]](self, data)
File "/home/feanor/Prog/git/vps-bench/.direnv/python-venv-3.7.2/lib/python3.7/site-packages/ruamel/yaml/representer.py", line 359, in represent_dict
return self.represent_mapping(u'tag:yaml.org,2002:map', data)
File "/home/feanor/Prog/git/vps-bench/.direnv/python-venv-3.7.2/lib/python3.7/site-packages/ruamel/yaml/representer.py", line 222, in represent_mapping
node_value = self.represent_data(item_value)
File "/home/feanor/Prog/git/vps-bench/.direnv/python-venv-3.7.2/lib/python3.7/site-packages/ruamel/yaml/representer.py", line 121, in represent_data
node = self.yaml_representers[None](self, data)
File "/home/feanor/Prog/git/vps-bench/.direnv/python-venv-3.7.2/lib/python3.7/site-packages/ruamel/yaml/representer.py", line 392, in represent_undefined
raise RepresenterError('cannot represent an object: %s' % data)
ruamel.yaml.representer.RepresenterError: cannot represent an object: AddressFamily.AF_INET
【问题讨论】:
-
你真的应该使用
syaml.dump(third_party_lib(), sys.stdout)而不是你正在做的事情,因为记录在案的是缓慢且内存效率低下。这里只是分散了真正的问题:AddressFamily没有代表注册(“声明”)
标签: python python-3.x serialization yaml ruamel.yaml