问题描述
我有一本字典,其中的键是对象。这些对象可以视为元组包装,并且确实实现了__hash__
和__repr__
。
example = {
Coordinates(0,0): Rome,Coordinates(0,1): Zurich
}
我想使用对象的repr用yaml
打印字典。这将是所需的输出:
(0,0): Rome
(0,1): Zurich
相反,我得到的是:
? !!python/object:__main__.Coordinates
x: 0
y: 0
: Rome
? !!python/object:__main__.Coordinates
x: 0
y: 1
: Zurich
我正在通过以下方式进行转换:
import yaml
print(yaml.dump(example,allow_unicode=True,default_flow_style=False))
到目前为止,我发现的唯一解决方案是亲自将所有内容强制转换为str()
。有更优雅的解决方案吗?
解决方法
假设类型Coordinates
存在,这就是设置:
import yaml
from yaml.resolver import BaseResolver
def coord_representer(dumper,data):
return dumper.represent_scalar(BaseResolver.DEFAULT_SCALAR_TAG,data.__repr__())
yaml.add_representer(Coordinates,coord_representer)
DEFAULT_SCALAR_TAG
确保PyYAML不会转储标量(x,y)
的显式标签。您可能要改用实际的YAML序列:
def coord_representer(dumper,data):
return dumper.represent_sequence(BaseResolver.DEFAULT_SEQUENCE_TAG,[data.x,data.y],flow_style=[True,True])
这将产生[x,y]
(YAML流序列)。问题在于,重新读起来很棘手,因为PyYAML默认会从中构造一个列表,该列表不能用作字典键。