PyYAML:官方示例失败

时间:2019-06-26 06:05:05

标签: python pyyaml

我正在尝试在the PyYAML documentation中运行一个官方示例。但是,它失败并显示以下错误:

yaml.scanner.ScannerError: mapping values are not allowed here
  in "<unicode string>",

下面是我的代码。 m成功运行,并且n引发错误。 mn之间的区别是缺少“ ---”。

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)
  1. 为什么?
  2. 如果我想从字符串加载到init的多个实例,请给我看看代码吗?

1 个答案:

答案 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,并且功能略有不同。