能否在YAML中实现类JS的无缩进嵌套写法以控制列宽?
YAML中使用点语法扩展已有嵌套对象是否可行?
问题背景
在JavaScript中,我们可以先定义嵌套对象,再通过点语法为其追加属性:
const myObj = { key1: val1, key2: val2 } myObj.keyWithLongVal = { ... }
最终得到包含所有属性的单一对象。现在想在YAML中实现类似效果,用点语法避免深层嵌套,控制文件行宽在80列内,示例写法如下:
very: heavily: nested: obj: lorem very.prose: | Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
结论:这种写法不可行
YAML不支持这种“点语法追加属性”的逻辑。上述示例会被解析成两个独立的顶级键:
- 一个是
very,值为包含heavily.nested.obj的嵌套对象 - 另一个是
very.prose,值为那段多行文本
并不会将prose属性追加到原来的very对象中。
正确的替代方案
要实现给已有嵌套对象添加属性同时控制行宽,有两种常用方法:
1. 折叠式映射写法
对于需要避免深层嵌套的属性,直接在原对象下追加,或把部分嵌套结构改成行内形式:
very: heavily: nested: obj: lorem prose: | Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
如果嵌套层级过深,可简化部分结构:
very: heavily: { nested: { obj: lorem } } prose: | Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
2. 锚点与别名合并属性
部分YAML解析器(如PyYAML)支持锚点复用+合并属性,可拆分大对象定义:
very_base: &very_base heavily: nested: obj: lorem very: <<: *very_base prose: | Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
相关问题参考
对应Stack Overflow问题:《如何扁平化YAML结构(列表/映射)》
内容的提问来源于stack exchange,提问作者AvidSeeker
相关产品推荐
相关产品推荐

