我正在尝试在PyYAML文档中运行一个官方示例。但是,它失败了,出现了以下错误:
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)发布于 2019-06-26 13:01:06
在"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]在文档中的示例中,---没有缩进,然后是一个文档开始标记,这也将! 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支持)中,---被重命名为指令结束标记,功能细微不同。
https://stackoverflow.com/questions/56766194
复制相似问题