【问题标题】:YAML : Use mapped list vs arrayYAML:使用映射列表与数组
【发布时间】:2019-06-18 08:16:06
【问题描述】:

我正在为我的应用程序创建一个配置文件。为此,我决定使用 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)并为每个数据集生成输出文件。 但是现在,我真的不知道最好的解决方案是什么......

您建议使用什么?又是什么原因?

【问题讨论】:

    标签: data-structures configuration yaml configuration-files


    【解决方案1】:

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

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

    所以,最终答案是(一如既往):视情况而定。想想你想用它做什么。对于简单的配置文件,我的第二个参数可能比第一个参数弱,但我不知道你到底想对数据做什么。

    【讨论】:

      【解决方案2】:

      快速回答 (TL;DR)

      • 使用 YAML ddconfig 格式可以非常干净、直接地对 YAML 进行规范化
      • 使用这种方法可以简化配置文件的构建和维护,并使其高度灵活,以供以后使用的多种类型的应用程序使用。

      详细解答

      上下文

      • 使用 YAML ddconfig 格式的数据规范化(又名 YAML 模式定义)
        • (标签:dreftymac@dreftymac.org,2017:ddconfig
        • dmid://uu773yamldata1620421509

      问题

      • 场景:开发者 graille_sentiplub 正在创建一种用于 YAML 的配置文件格式。

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

      示例

      • 以下是使用 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 映射(又名字典)(又名关联数组)组成。

        • 每个映射键都是dataroot 的一级子级(如果省略了 dataroot,则为顶级键)。
      • 有不同类型的映射键:

        • 字符串:(后缀_str)表示映射的值是字符串(又名标量)值。
        • 列表:(后缀_list)表示映射的值是一个列表(又名序列)。
        • 信息:(后缀_info)表示映射的值是映射(又名字典)(又名关联数组)。
        • 表格:(后缀_table)表示映射的值是一个映射序列(又名表格)。
        • :(后缀_tree)表示支持一个或多个嵌套父子关系的复合结构。

      基本原理

      • YAML ddconfig 格式与许多不同的上下文和工具非常吻合。
      • 这样可以在布置配置文件格式时简化决策,并在解析文件时简化编程。

      简单

      • _list 映射由一系列没有嵌套的标量值项组成。
      • _info 映射由一个标量键和一个标量值(名称-值对)组成,没有嵌套。
      • _table 映射只是_info 映射的序列。
      • 可以通过 YAML 锚点和别名来实现任意深度的嵌套,从而支持 _tree 复合数据结构。

      与关系数据库的相似性

      • 您可以将 ddconfig _info 映射视为关系数据库中标准表的单个记录。
      • 您可以将ddconfig _table 映射视为关系数据库中的标准表。
      • 这种相似性使得在必要时将 YAML 传输到数据库变得非常简单。

      锚点和别名

      • YAML ddconfig 格式适用于 YAML 锚点和别名。
      • 一个或多个_info 映射可以通过别名轻松转换为_table 映射。
      • 可以通过 YAML 合并键将多个 _info 映射组合成另一个 _info 映射。

      另见

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-11
        • 2017-04-08
        • 1970-01-01
        相关资源
        最近更新 更多