5月28日 03:55
YAML 缩进规则有哪些?Tab 和空格混用为什么会报错?
YAML 用缩进表示层级关系,这是它和 JSON/XML 最大的区别——缩进不是排版,是语法。三条核心规则:只能用空格不能用 Tab、同一层级的元素缩进量必须一致、子级比父级多缩进即可(通常 2 个空格)。违反任何一条,解析器直接报错,不会像 Python 那样给你模糊的提示。
追问
为什么 YAML 禁止 Tab?
YAML 规范明确规定 Tab 不能用于缩进。原因是 Tab 的显示宽度在不同编辑器中不一致(有的算 4 格,有的算 8 格),解析器无法判断两个 Tab 等价于几个空格,索性禁止。实际踩坑:从网页或文档复制配置时,经常会带入隐藏的 Tab 字符,导致排查半天找不到原因。
同一层级的缩进不一致会怎样?
解析器会报 mapping values are not allowed here 或 expected <block end> 之类的错误。最典型的场景:
yamlserver: host: localhost port: 8080 # port 比 host 多缩进了 2 格 name: app
port 多了 2 个空格,解析器认为它是 host 的子键,但 host 的值已经是字符串 localhost,不能再有子键——于是报错。
列表项的缩进有什么坑?
列表项用 - 开头,短横线本身占一级缩进,后面的内容从短横线后一个空格开始算对齐:
yamlfruits: - apple - banana - orange
常见错误是列表项的子属性缩进不对:
yamlemployees: - name: Alice role: Dev # 错误:和 name 对齐了,但应该和 name 的值对齐 role: Dev # 正确:和 name 对齐(name 的 n 是对齐起点)
实际上两种写法都可能被解析,但第一种 role 会被当成和 - name 同级而不是 name 的兄弟属性,结构完全不同。
多行字符串的缩进怎么处理?
| 保留换行,> 折叠换行,缩进量以指示符行的缩进为基准:
yamldescription: | 第一行 第二行 缩进的第三行
多行块里,比首行多缩进的部分会保留额外缩进,少缩进则报错。|+ 保留末尾空行,|- 删除末尾空行——这是容易忽略的细节。
有什么快速排查缩进错误的方法?
- 编辑器开「显示空白字符」,一眼看到 Tab 和空格混用
yamllint config.yaml自动检查python -c "import yaml; yaml.safe_load(open('config.yaml'))"快速验证- VS Code 装 YAML 插件,实时标红缩进错误
最关键的一条:编辑器配置里把 Tab 自动转空格,从根源杜绝问题。