如何用ruamel.yaml将YAML 1.1类布尔字符串以带引号形式输出?
解决ruamel.yaml输出"Y"类字符串自动转为无引号布尔标量的问题
问题本质:ruamel.yaml默认遵循YAML规范,会将YAML 1.1定义的布尔标量(如
Y/N/yes/no等)自动处理为布尔类型,输出时不带引号。但Helm基于YAML 1.1解析,会把无引号的Y识别为布尔true,导致数据不符合预期。实现方案:通过自定义字符串类型并注册专属代表器,强制这类需保留为字符串的布尔标量输出时带引号:
from ruamel.yaml import YAML import sys yaml = YAML() # 自定义标记类,用于区分需要强制加引号的字符串 class QuotedStr(str): pass # 注册代表器,将QuotedStr序列化为带双引号的字符串 @yaml.representer.add_representer(QuotedStr) def represent_quoted_str(dumper, data): return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='"') # 使用示例 config = { 'approval_status': QuotedStr('Y'), 'description': 'regular string' } yaml.dump(config, sys.stdout)
- 输出结果:
approval_status: "Y" description: regular string
- 关键提醒:此前测试误用
T作为测试对象无意义,因为T不属于YAML 1.1的布尔标量范畴,ruamel.yaml不会自动将其转为布尔值,只有Y/N/yes/no/true/false等才会被自动识别为布尔标量。
内容的提问来源于stack exchange,提问作者ChickenWing
相关产品推荐
相关产品推荐

