YAML 规范明确指出:
映射使用冒号和空格(“:”)来标记每个键:值对。
所以这是合法的:
foo: bar
但这不是:
foo:bar
我看到网上很多人都在抱怨这个空间。我认为他们说得有道理。我自己也被它烫伤过好几次。
为什么必须要有空格?其背后的设计考虑是什么?
很容易错过,因为该规范使用了仅突出显示内部链接的最后一个字符的奇怪约定,但您引用的部分中的
“: ”
实际上是一个链接到规范的另一部分,它回答了您的问题:
通常,YAML 坚持“:”映射值指示符与值之间用空格分隔。此限制的一个好处是“:”字符可以在普通标量内使用,只要它后面不跟空格即可。这允许不带引号的 URL 和时间戳。这也是一个潜在的混淆来源,因为“a:1”是一个普通的标量,而不是一个键:值对。
所以动机是你可以编写这样的列表而不需要任何引用:
useful_values:
- 2:30
- http://example.com
- localhost:8080
如果空格是可选的,则最终可能会产生歧义,并被解释为一组键值对。
旁白:这是一段 JS 代码,可以使该文档上的链接格式不再那么无用。
document.styleSheets[0].insertRule('a[href^="#"] { color: #00A !important; text-decoration: underline !important; background: none !important; }', 0);
更新:2021 年发布的修订版“1.2.2”规范使用更传统的链接格式,但该特定超链接不再存在。然而,引用的措辞没有改变。
实际上,列后的空格并不是“总是”强制的。如果满足两个条件,则可以选择: 使用
{}
/ []
);关键已被引用。pyyaml=5.3.1
):
{"x":abc}
输出:
{'x': 'abc'}
但要小心:
{x:abc} # {'x:abc': None}
# Can't separate key from value if not quoted
---
{x:"abc"} # {'x:"abc"': None}
# Same problem
更多带有冒号和空格的边缘情况:
x:::abc # 'x:::abc'
# Scalar, not a key-value
---
x:: :abc # {'x:': ':abc'}
# Avoid this, use quotes to be safe if `:` is
# involved in either key or value.
---
{x:: :abc} # Error: while parsing a flow node expected the node
# content, but found ':'
# Parsing logic for flow syntax can be surprising.
---
{"x:":":abc"} # {'x:': ':abc'}
# Follow the "least surprise principle" - stick to JSON syntax.