为什么 YAML 规范要求冒号后有一个空格?

问题描述 投票:0回答:2

YAML 规范明确指出:

映射使用冒号和空格(“:”)来标记每个键:值对。

所以这是合法的:

foo: bar

但这不是:

foo:bar

我看到网上很多人都在抱怨这个空间。我认为他们说得有道理。我自己也被它烫伤过好几次。

为什么必须要有空格?其背后的设计考虑是什么?

yaml language-design
2个回答
28
投票

很容易错过,因为该规范使用了仅突出显示内部链接的最后一个字符的奇怪约定,但您引用的部分中的

“: ”
实际上是一个链接到规范的另一部分,它回答了您的问题:

通常,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”规范使用更传统的链接格式,但该特定超链接不再存在。然而,引用的措辞没有改变。


2
投票

实际上,列后的空格并不是“总是”强制的。如果满足两个条件,则可以选择: 使用

    Flow style
  1. 语法(又名 JSON / one-liner / {} /
    []
    );
    关键已被引用。
  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.

	
© www.soinside.com 2019 - 2024. All rights reserved.