【问题标题】:Why does the YAML spec mandate a space after the colon?为什么 YAML 规范要求冒号后面有一个空格?
【发布时间】:2022-01-30 04:11:11
【问题描述】:

YAML spec 明确指出:

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

所以这是合法的:

foo: bar

但这不是:

foo:bar

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

为什么空格是强制性的?其背后的设计考虑是什么?

【问题讨论】:

    标签: yaml language-design


    【解决方案1】:

    很容易错过,因为该规范使用了仅突出显示内部链接的最后一个字符的奇怪约定,但您引用的部分中的“: ” 实际上是一个链接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);
    

    【讨论】:

    • 我想知道为什么yamllint.com 违反规范并说“key:value”是有效的 yaml 语法。
    • 我们只是打破了这方面的规范,以及缩进总是由空格组成的要求,通过使用自定义函数预处理所有 YAML 输入文本。这只需要大约 20 行代码,而且,男孩,为我们编写 YAML 的客户消除头痛是否值得。
    【解决方案2】:

    实际上,列后的空格始终不是强制性的。满足两个条件是可选的:

    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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 2015-10-18
      • 2020-09-21
      • 2016-11-08
      • 1970-01-01
      相关资源
      最近更新 更多