YAML 中调用的 < < (双左箭头)语法是什么,它在哪里被指定?

YAML 中的 <<:操作符可用于将一个映射的内容导入到另一个映射中,类似于 Python 中的 **双 splat 操作符或 JavaScript 中的 ...对象解构操作符。比如说,

foo:
a: b
<<:
c: d
e: f

相当于

foo:
a: b
c: d
e: f

This is useful when used along with 节点锚 to include some common default properties in many objects, as illustrated in, for example, the 在 Y 分钟内学会 YAML tutorial:

# Anchors can be used to duplicate/inherit properties
base: &base
name: Everyone has same name


foo: &foo
<<: *base
age: 10


bar: &bar
<<: *base
age: 20

然而,我对这种语法来自哪里或者为什么它能工作感到困惑。CTRL + Fing 的 YAML 规范<<表明,它不出现在任何地方的规格。然而,它至少得到了 PyYAMLhttp://yaml-online-parser.appspot.com/的支持。

这个语法是什么,为什么它在规范中似乎没有出现?

46813 次浏览

它被称为 YAML 版本1.1的合并关键语言独立类型(Merge Key Language-Independent Type) ,并被指定为 给你

它是解析器可以选择支持的东西,它本质上是对键值对和特殊键 <<的解释,其中的值要么是一个映射(通常通过规范中的别名表示,尽管这似乎不是必需的,但不使用别名是没有意义的) ,要么是一个映射列表(即映射的别名) ,并以一种特殊的方式进行解释。

补充其它答案:

在我看来,“在 Y 分钟内学习 yaml”的例子是不完整的,因为它没有显示键相同时会发生什么。例如:

base: &base
name: Everyone has same name
age: 5


foo: &foo
<<: *base


bar: &bar
<<: *base
age: 20

对于排名靠后的两个项目,结果是:

foo:
name: Everyone has same name
age: 5


bar:
name: Everyone has same name
age: 20

bar覆盖年龄,而 foo不覆盖年龄。根据 说明书,合并的对象条目的优先级比接收它们的对象条目的优先级低。

“ < <”合并键用于指示应将一个或多个指定映射的所有键插入到当前映射中。如果与键关联的值是单个映射节点,则将其每个键/值对插入到当前映射中,除非键已经存在于其中。