有人可以解释为什么这个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 }}
答案 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中开始一个简单的标量。