如何将类字符串Python对象无标签导出为简洁YAML?
自定义YAML序列化MyString类为无标签字符串
问题背景
假设我们有如下自定义字符串类:
class MyString: def __init__(self, value: str): self.value = value def __str__(self): return '"{}"'.format(self.value)
需求是将该类的实例导出为简洁的YAML格式,例如把MyString("abc")序列化为YAML中的"abc",但之前尝试的自定义representer会生成带标签的结果:
# 之前的尝试代码 import yaml def mystring_representer(dumper, data): return dumper.represent_scalar('!qs', str(data)) yaml.add_representer(MyString, mystring_representer)
这段代码生成的YAML会带有!qs标签,不符合简洁输出的需求。
解决方法
要生成无标签的标准字符串,不需要自定义标签,直接复用YAML内置的字符串序列化逻辑即可,有两种实现方式:
方法一:使用represent_str
直接调用YAML内置的字符串序列化方法,适配MyString的结构:
import yaml class MyString: def __init__(self, value: str): self.value = value def __str__(self): return '"{}"'.format(self.value) # 自定义representer,复用内置字符串序列化逻辑 def mystring_representer(dumper, data): return dumper.represent_str(data.value) yaml.add_representer(MyString, mystring_representer) # 测试序列化效果 ms = MyString("abc") print(yaml.dump({"content": ms}))
输出结果:
content: "abc"
方法二:指定内置字符串标签
如果需要更灵活控制标量样式,也可以用represent_scalar指定YAML内置的字符串标签:
def mystring_representer(dumper, data): return dumper.represent_scalar('tag:yaml.org,2002:str', data.value)
该方法和方法一效果一致,不会生成自定义标签。
说明
通过复用YAML内置的字符串序列化逻辑,可让MyString实例的序列化结果与普通Python字符串完全一致,满足简洁无标签的输出需求。
内容的提问来源于stack exchange,提问作者user9410891
相关产品推荐
相关产品推荐

