You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将类字符串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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:19:58