【问题标题】:Invalid YAML formatting?YAML 格式无效?
【发布时间】:2017-05-14 09:52:35
【问题描述】:

谁能解释为什么这个 YAML 无效?

playing_song_artist: Playing song, {{ song_name }} by {{ artist }}

playing_playlist: {{ action }} playlist {{ playlist_name }}

第一行很好,但我不知道第二行有什么问题......

expected <block end>, but found '<scalar>'
  in "<string>", line 3, column 32:
    playing_playlist: {{ action }} playlist {{ playlist_name }}

【问题讨论】:

  • actionartistsong_nameplaylist_name 的替换值是什么?
  • PlayingTest,但 yaml-online-parser.appspot.com 显示它无效,甚至没有看到值。

标签: python flask yaml jinja2


【解决方案1】:

粗略地说,YAML 解析器试图推断值的类型,并且由于值的语法与其推断不匹配,因此解析器失败了。

{{ action }} playlist {{ playlist_name }}

因为{ 是第一个字符,所以它无法确定它应该查看的是字符串(例如,用于模板扩展)还是dict。由于{,YAML 解析器需要一个字典,但当然,{{ action }} 不是一个有效的字典,所以 YAML 解析器失败。如果您想将该值视为字符串,只需用双引号将其括起来即可。

playing_playlist: "{{ action }} playlist {{ playlist_name }}"

而在第一个示例字符串中:

Playing song, {{ song_name }} by {{ artist }}

Playing是一个字符串,所以YAML解析器可以推断出整个值的类型是一个字符串。

【讨论】:

    【解决方案2】:

    ,{} 在 YAML 中都是 indicator characters。您可以引用需要在 YAML 中包含指标字符的字符串。像这样,

    playing_song_artist: "Playing song, {{ song_name }} by {{ artist }}"
    
    playing_playlist: "{{ action }} playlist {{ playlist_name }}"
    

    试试这个例子,看看流映射如何与,{}一起工作

    playing_song_artist : {a and b, hello}
    

    【讨论】:

    • {} 不是指示符。 {} 是。另请注意,在字符串周围使用" 可能会在加载时更改其标量值(例如,当原始字符串中有反斜杠时)
    【解决方案3】:

    解析器被世界“播放列表”弄糊涂了,因为它只解析了一个流样式映射,并且应该是行尾(或可能是注释)而不是标量。

    对于这两个映射值,解析器在遇到: 后开始处理块映射值。要将映射值解析为plain style scalar,就像在您的第一个映射条目中一样,该值可以以ns-char 开头,但不能以c-indicator 开头。对于后者,产生式规则 22 为您提供了一个列表,其中一个普通样式的标量(即不带引号的标量)不能开始:

    [22] c-indicator ::= “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}”
                         | “#” | “&” | “*” | “!” | “|” | “>” | “'” | “"”
                         | “%” | “@” | “`”
    

    如果不清楚,则以下行说明:

    “[”、“]”、“{”、“}”和“,”指示符表示流集合中的结构。因此在某些情况下它们是被禁止的,以避免在几个结构中产生歧义。这由相关制作根据具体情况进行处理。

    在这种特殊情况下,{ 启动了一个流映射,这很好,但正如所示,您不能在关闭 } 之后拥有“内容”

    因此,您不能有一个普通的标量,并且必须在标量周围加上引号,例如单身:

    laying_playlist: '{{ action }} playlist {{ playlist_name }}'
    

    或双倍:

    laying_playlist: "{{ action }} playlist {{ playlist_name }}"
    

    但是如果有反斜杠,那么在普通标量周围加上引号可能会改变它的值。字符串中的单引号,所以它可能是最安全的 使其成为文字块样式标量,并去除最后的换行符:

    laying_playlist: |-
         {{ action }} playlist {{ playlist_name }}
    

    这种混淆是由于使用 {{}} 来包围替换引起的,选择一个不以 YAML [c-indicator][3] 开头的字符组合会更好,但这仍然是相对的在文本中独一无二。例如 &lt;{}&gt; 不会产生问题,因为 &lt; 可以在 YAML 中启动一个普通的标量。

    【讨论】:

      猜你喜欢
      • 2017-11-25
      • 2018-09-05
      • 2020-04-24
      • 2017-08-09
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      相关资源
      最近更新 更多