【发布时间】:2022-01-30 04:11:11
【问题描述】:
YAML spec 明确指出:
映射使用冒号和空格(“:”)来标记每个键:值对。
所以这是合法的:
foo: bar
但这不是:
foo:bar
我看到网上很多人都在抱怨这个空间。我认为他们说得有道理。我自己被它烧了好几次。
为什么空格是强制性的?其背后的设计考虑是什么?
【问题讨论】:
标签: yaml language-design
YAML spec 明确指出:
映射使用冒号和空格(“:”)来标记每个键:值对。
所以这是合法的:
foo: bar
但这不是:
foo:bar
我看到网上很多人都在抱怨这个空间。我认为他们说得有道理。我自己被它烧了好几次。
为什么空格是强制性的?其背后的设计考虑是什么?
【问题讨论】:
标签: yaml language-design
很容易错过,因为该规范使用了仅突出显示内部链接的最后一个字符的奇怪约定,但您引用的部分中的“: ” 实际上是一个链接to another section of the specification,它回答了您的问题:
通常,YAML 坚持“:”映射值指示符与值之间用空格隔开。此限制的一个好处是“:”字符可以在纯标量中使用,只要它后面没有空格即可。这允许不带引号的 URL 和时间戳。它也是一个潜在的混淆来源,因为“a:1”是一个普通的标量,而不是一个键:值对。
所以动机是您可以编写这样的列表而无需任何引用:
useful_values:
- 2:30
- http://example.com
- localhost:8080
如果空格是可选的,这最终可能会产生歧义,并被解释为一组键值对。
旁白:这是一个 JS 的 sn-p,可以使该文档上的链接格式变得不那么无用。
document.styleSheets[0].insertRule('a[href^="#"] { color: #00A !important; text-decoration: underline !important; background: none !important; }', 0);
【讨论】:
实际上,列后的空格始终不是强制性的。满足两个条件是可选的:
{} / []);此语法有效 (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.
【讨论】: