无效的YAML格式?

时间:2016-12-30 03:59:23

标签: python flask yaml jinja2

有人可以解释为什么这个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 }}

3 个答案:

答案 0 :(得分:1)

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

{{ action }} playlist {{ playlist_name }}

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

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

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

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

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

答案 1 :(得分:1)

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}

答案 2 :(得分:1)

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

对于两个映射值,解析器在遇到:后开始处理块映射值。要将映射值解析为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]开头的字符组合会好得多,但这在文本中仍然相对独特。 E.g <{}>不会出现问题,因为<可以在YAML中开始一个简单的标量。