YAML:使用映射列表与数组

时间:2019-01-24 14:46:32

标签: configuration yaml configuration-files

我正在为我的应用程序创建一个配置文件。为此,我决定使用YAML来实现简单性和可靠性。

我目前正在设计应用程序的特殊部分:在这一部分中,我必须列出并配置要在模块中使用的所有数据集。为此,我写了这个:

    // Other stuff       
    datasets:
        rate_variation:
            name: Rate variation over time # Optional
            description: Description here # Optional
            type: POINTS_2D
            options:
                REFRESH_TIME: 5 # Time of refresh in second
        frequency_variation:
            name: Frequency variation over time
            description: Description here # Optional
            type: POINTS_2D

但是,经过一番反思,我对此表示怀疑。因为也许像这样更好:

    datasets:
        -   id: rate_variation
            name: Rate variation over time # Optional
            description: Description here # Optional
            type: POINTS_2D
            options:
                REFRESH_TIME: 5 # Time of refresh in second
        -   id: frequency_variation
            name: Frequency variation over time
            description: Description here # Optional
            type: POINTS_2D

我使用ID来识别脚本中的每个数据集(两个数据集必须具有不同的ID),并为每个数据集生成输出文件。 但是现在,我真的不知道什么是最好的解决方案...

您建议使用什么?出于什么原因?

2 个答案:

答案 0 :(得分:1)

使用第一个选项,YAML强制没有重复的ID。因此,在这种情况下,支持YAML的编辑器可能会通过显示错误来支持您的用户。使用第二个选项,您需要检查代码中的唯一性,并且用户只有在将语法正确的YAML加载到应用程序中时,用户才会看到错误。

但是,还有其他因素需要考虑。例如,您可能会对生成的内存中数据结构有偏好。如果您使用反序列化为本地数据结构(PyYAML,SnakeYAML等)的标准YAML实现,则YAML结构会强加内存中数据结构的类型(您可以通过编写自定义构造函数进行自定义,但这并不简单)。例如,如果要向数据集对象查询其ID,则只能直接在第二个结构中使用–如果使用第一个结构,则需要在父表中搜索必须获取其ID的数据集值

所以,最后的答案是(一如既往):这取决于。考虑一下您想使用它做什么。对于简单的配置文件,我的第二个参数可能比我的第一个参数弱,但是我不知道您到底想对数据做什么。

答案 1 :(得分:0)

快速解答(TL; DR)

  • 可以使用YAML ddconfig格式以一种非常简单的方式对YAML进行非常干净的标准化
  • 使用这种方法可以简化配置文件的构造和维护,并使其高度灵活,以供以后由多种类型的使用应用程序使用。

详细答案

上下文

  • 采用YAML ddconfig格式的数据规范化(也称为YAML模式定义)
    • (标签:dreftymac @ dreftymac.org,2017年:ddconfig

问题

  • 方案::开发人员graille_stentiplub正在创建用于YAML的配置文件格式。

    • YAML的数据结构(即架构)必须灵活多变,以便在许多情况下使用。
    • 该架构应适合YAML结构不会“妨碍”的任意灵活查询。
    • 该模式应该易于人类阅读和理解。
    • 该架构应易于被能够处理标准YAML的任何编程环境所操纵。
  • 特殊注意事项: graille_stentiplub想要一种简单的方法来确定何时使用列表和映射。

示例

  • 以下是使用YAML ddconfig格式的简单配置文件

    dataroot:
    
        file_metadata_str: |
          ### <beg-block>
          ### - caption: "my first project"
          ###   notes:  |
          ###     * href="//home/sm/docs/workup/my_first_project.txt"
          ### <end-block>
    
        project_info:
          prj_name_nice:        StackOverflow Demo Answer Project
          prj_name_mach:        stackoverflow_demo_001a
          prj_sponsor_url:      https://stackoverflow.com/questions/54349286
          prj_dept_url:         https://demo-university.edu/dept/basketweaving
    
        dataset_recipient_list:
          - graille_stentiplub@example.org
          - dreftymac_lufcrom@demo-university.edu
          - nobody_knows_who_you_are@example.com
    
        dataset_variations_table:
            -   dvar_id:            rate_variation
                dvar_name:          Rate variation over time      # Optional
                dvar_description:   Description here              # Optional
                dvar_type:          POINTS_2D
                dvar_opt_refresh_per_second: 5                    # Time in seconds
    
            -   dvar_id:            frequency_variation
                dvar_name:          Frequency variation over time
                dvar_description:   Description here              # Optional
                dvar_type:          POINTS_2D
    

说明

  • 整个数据结构嵌套在名为dataroot的顶级密钥下(这是可选的)。

    • 包含dataroot键可以使YAML结构更易于访问,但不是必需的。
    • 使用文件系统类比,您可以将dataroot视为根目录。
    • 使用XML类比,您可以将其视为根级XML标签。
  • 整个数据结构由一个YAML映射(又称dictionay)(又称为关联数组)组成。

    • 每个映射键都是dataroot的第一级子级(如果省略dataroot,则为顶级键)。
  • 映射键有四种类型

    • 字符串 :(后缀_str)表示映射的值为字符串(即标量)值。
    • 列表 :(后缀_list)表示映射的值是列表(又称序列)。
    • 信息 :(后缀_info)表示映射的值正在映射(又称字典)(又称关联数组)。
    • :(后缀_table)表示映射的值是映射序列(又称表)。

理性

  • YAML ddconfig格式与许多不同的上下文和工具非常吻合。
  • 这可简化布局配置文件格式时的决策,并简化解析文件时的编程。
简单
  • _list映射由一系列无嵌套的标量值项组成。
  • _info映射由无嵌套的标量键和标量值(名称-值对)组成。
  • _table映射只是_info映射的序列。
  • 可以通过YAML锚点和别名来完成任意深度的嵌套。
与关系数据库的相似性
  • 您可以将ddconfig _info映射视为关系数据库中标准表中的一条记录。
  • 您可以将ddconfig _table映射视为关系数据库表中的表。
  • 这种相似性使得在必要时将YAML传输到数据库非常简单。
锚点和别名
  • YAML ddconfig格式可与YAML锚点和别名完美配合。
  • 通过别名可以轻松地将一个或多个_info映射转换为_table映射。
  • 可以通过YAML合并键将多个_info映射合并到另一个_info映射中。