【问题标题】:PyYAML can't parse sequence of sequencesPyYAML 无法解析序列序列
【发布时间】:2020-11-02 05:16:26
【问题描述】:

这是有效的 YAML:

jobs:
  - type: Agricultural

这不是有效的 YAML:

jobs:
  - type: Agricultural
    - title: Farmer

为什么不呢?在 PyYAML 中,这会产生:

yaml.parser.ParserError: while parsing a block mapping
  in "jobs.yaml", line 2, column 5
expected <block end>, but found '-'
  in "jobs.yaml", line 3, column 5

【问题讨论】:

  • type 不能有两个值:Agriculture 和一个列表。您的 YAML 无效。
  • 你如何使它有效?我的目的是列出不同类别和头衔的工作。许多可能的类别,许多不同的标题。

标签: python yaml pyyaml


【解决方案1】:

这是无效的原因是因为您正在尝试拥有一个由映射和序列组成的节点,并且在 YAML 中是不允许的,其中节点要么是这些组合之一,要么是基元。

如果只有键值对(type,Agricultural)的映射,序列包含映射(带键title

有多种方法可以将其更改为有效的 YAML,以下是一些:

  • 您可以省略 type 键并使用 agricultural 作为嵌套列表的键:

    jobs:
      - Agricultural:
        - title: Farmer
    
  • 您可能不需要嵌套序列:

    jobs:
      - Agricultural:
        title: Farmer
    
  • 您可以使用标签,它允许您直接加载正确的底层类,而不是自己检查字符串Agricultural

    jobs:
      - @Agricultural
        title: Farmer
    

后者需要注册一个适当的类,但如果您有多个工作(子)类型,IMO 是最佳解决方案。

【讨论】:

    【解决方案2】:

    一个有效的和你想要的东西的例子:

    --- 
    jobs: 
      - type: agricultural
        titles: 
          - Farmer
          - Picker
          - Combine Operator
       - type: manufacturing
         titles:
           - assembler
           - shipper
           - shop forman
    

    【讨论】:

    • 但我不想到处重复“类型:农业” - 我想按类别对工作进行分组。
    • 现在检查我的答案。
    • 我想知道为什么我的上述解决方案不起作用。如果一个工作可以有很多'-类型',为什么一个'类型'不能有很多'-标题'?
    • 你的想法是错误的。它在那里表示的方式......工作有一个由 - (破折号)描述的事物列表,每个条目在列表中。然后列表中的每个条目都有一组键,这些键的值可以是简单值(数字、字符串、布尔值)、事物列表或另一组具有值的键。如果您在我的示例中将其读入 python,您将拥有: base['jobs'][0]['titles'][0] 它是 yaml 条目可以包含的语法。它不能有那个赤裸裸的 - 标题列表条目中没有任何东西可以用来引用它。
    • 另一种思考方式是您告诉 yml 列表条目是使用键值语法的 dict。您需要继续将其用于下一行。它在获得 - 标题时期待一个键
    猜你喜欢
    • 2020-01-16
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2017-06-04
    相关资源
    最近更新 更多