-
StackOverflow 文档
-
yaml 教程
-
使用锚点和别名来转换内容
-
使用 YAML 合并键来交叉引用另一个 YAML 表中的行
---
person_table:
- &person001
fname: homer
lname: simpson
role: dad
age: 33
- &person002
fname: marge
lname: simpson
role: mom
age: 34
- &person003
fname: peter
lname: griffin
role: dad
age: 34
motto_table:
- &motto001
<<: *person001
motto: >
D'oh!! YAML is too complicated!
- &motto002
<<: *person002
motto: >
Bart! Listen to your father!
- &motto003
<<: *person003
motto: >
Hey! YAML is freakin' sweet!
问题
- 开发人员希望从一个表交叉引用 rows-with-anchors,并在另一个表中使用 rows-as-aliases 链接到它们
- 开发人员希望避免创建嵌套字典问题
解
- 使用 YAML 别名,使用 YAML 合并键
- 在 YAML 中,可重用的“transclusion 标识符”称为锚点和别名
- 在 YAML 中,可重复使用的“transclusion 标识符”由字母数字标记组成,前面带有&符号或星号
合理
- YAML 锚点和别名允许增加数据规范化
- YAML 锚点和别名强制执行
DRY
(不要重复自己)
- 在这个例子中,可以设计和保存一个与数据库紧密相符的表结构
- 在此示例中,可以减少数据输入和文件大小
陷阱
- 在这个具体的例子中,
yaml.load()
将生成嵌套的词典
- 在人名 - 值对下,人的值将是子词典
- 这可能是不希望的,因为它破坏了桌子结构的均匀性
- 无法正确指定别名将导致数据丢失
- YAML 不支持通过引用进行文件转换,因此所有别名和锚点必须存在于同一 yaml 文件中
- 并非所有 YAML 解析器都可靠地支持锚点和别名
也可以看看