我正在尝试在the PyYAML documentation中运行一个官方示例。但是,它失败并显示以下错误:
yaml.scanner.ScannerError: mapping values are not allowed here
in "<unicode string>",
下面是我的代码。 m
成功运行,并且n
引发错误。 m
和n
之间的区别是缺少“ ---
”。
import yaml
class Monster(yaml.YAMLObject):
yaml_tag = '!Monster'
def __init__(self, name, hp, ac, attacks):
self.name = name
self.hp = hp
self.ac = ac
self.attacks = attacks
def __repr__(self):
return "%s(name=%r, hp=%r, ac=%r, attacks=%r)" % (
self.__class__.__name__, self.name, self.hp, self.ac,
self.attacks)
if __name__ == '__main__':
m = yaml.load("""
!Monster
name: Cave spider
hp: [2,6] # 2d6
ac: 16
attacks: [BITE, HURT]
""")
print(m)
n = yaml.load("""
--- !Monster
name: Cave spider
hp: [2,6] # 2d6
ac: 16
attacks: [BITE, HURT]
""")
print(n)
答案 0 :(得分:0)
在“ n”版本中,您正在尝试加载以多行非引号标量开头的YAML文件
--- !Monster name
,不允许将这样的标量作为映射键。如果要执行此操作,则需要用双引号或单引号将标量引号(我添加了YAML注释以使缩进更清晰):
# n-example
"--- !Monster
name": Cave spider
hp: [2,6] # 2d6
ac: 16
attacks: [BITE, HURT]
或将未引用的映射键放在一行上
# n-example
--- !Monster name: Cave spider
hp: [2,6] # 2d6
ac: 16
attacks: [BITE, HURT]
在文档的示例中,---
没有缩进,然后是document start marker,这也将!
grom的含义更改为普通的标量中标感叹号到标签的开头解决此问题并保持代码缩进和可读的最佳方法是使用dedent
:
from textwrap import dedent:
if __name__ == '__main__':
n = yaml.load(dedent("""\
--- !Monster
name: Cave spider
hp: [2,6] # 2d6
ac: 16
attacks: [BITE, HURT]
"""))
print(n)
在更新的YAML 1.2规范(2009年发布,PyYAML不支持)中,---
重命名为directives end marker,并且功能略有不同。