YAML无引号标量能否包含冒号?ruamel.yaml安全加载器报错咨询
问题
原本以为YAML无引号标量可以包含冒号,但使用ruamel.yaml 0.18.10解析以下YAML时,因标量中的冒号被拒绝:
a: {s: D:G}
请问这是ruamel.yaml的bug,还是该标量本就无效需加引号?
复现代码:
from ruamel.yaml import YAML s = r"""a: {s: D:G} """ yaml = YAML(typ="safe") yaml.load(s)
经测试,仅当YAML对象配置为typ='safe'时存在此问题,其他加载器可正常解析。
解答
- 这不是ruamel.yaml的bug,是
safe模式的严格解析规则导致的结果。 - YAML无引号标量确实允许包含冒号,但在流样式映射(
{}包裹的结构)中,未加引号的D:G会引发解析歧义:safe加载器会将冒号视为键值对的分隔符,误以为D是新键、G是对应值,从而判定格式错误。 - 非safe模式(如默认的
typ='rt')采用了更宽松的解析逻辑,能自动识别这是单个标量,所以可以正常解析。 - 要让
safe模式正常解析,需给包含冒号的标量添加引号消除歧义,写法如下:a: {s: 'D:G'}
内容的提问来源于stack exchange,提问作者strubbly
相关产品推荐
相关产品推荐

