YAML:使用映射列表与数组

问题描述 投票:0回答:2

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

你会建议使用什么?出于什么原因?

configuration yaml configuration-files
2个回答
1
投票

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

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

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


0
投票

快速回答(TL; DR)

  • 使用YAML ddconfig格式,可以非常干净地以简单的方式对YAML进行标准化
  • 使用此方法可以简化配置文件的构建和维护,并使其具有高度灵活性,以供以后许多类型的消费应用程序使用。

详细解答

Context

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

Problem

  • 场景:开发人员graille_stentiplub正在创建用于YAML的配置文件格式。 YAML的数据结构(即模式)必须灵活,以便在许多环境中使用。 模式应该适用于任意和灵活的查询,其中YAML的结构不会“妨碍”。 架构应该易于人类阅读和理解。 任何能够处理标准YAML的编程环境都应该能够轻松地操作模式。
  • 特别注意事项:graille_stentiplub想要一种简单的方法来确定何时使用列表与映射。

Example

  • 以下是使用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: - [email protected] - [email protected] - [email protected] 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

Explanation

  • 整个数据结构嵌套在名为dataroot的顶层键下(这是可选的)。 包含dataroot密钥使YAML结构更易于理解,但不是必需的。 使用文件系统类比,您可以将dataroot视为根级目录。 使用XML类比,您可以将其视为根级XML标记。
  • 整个数据结构由YAML映射(又名字典)(也称为关联数组)组成。 每个映射键都是dataroot的第一级子级(如果省略dataroot,则为顶级子级)。
  • 有四种类型的映射键 字符串:(后缀_str)表示映射的值是字符串(也称为标量)值。 列表:(后缀_list)表示映射值是一个列表(也称为序列)。 信息:(后缀_info)表示映射值是映射(又名字典)(也称为关联数组)。 表:(后缀_table)表示映射值是映射序列(aka表)。

Rationale

  • YAML ddconfig格式与许多不同的上下文和工具很吻合。
  • 这样可以在布局配置文件格式时简化决策,并在解析文件时简化编程。
Simplicity
  • _list映射由一系列没有嵌套的标量值项组成。
  • _info映射由标量键和标量值(名称 - 值对)组成,没有嵌套。
  • _table映射只是一系列_info映射。
  • 可以通过YAML锚点和别名来完成任意深度的嵌套。
Similarity to relational databases
  • 您可以将ddconfig _info映射视为关系数据库中标准表的单个记录。
  • 您可以将ddconfig _table映射视为关系数据库表中的表。
  • 这种相似性使得在必要时将YAML传输到数据库非常简单。
Anchors and aliases
  • YAML ddconfig格式适用于YAML锚点和别名。
  • 一个或多个_info映射可以通过别名轻松转换为_table映射。
  • 可以通过YAML合并键将多个_info映射组合到另一个_info映射中。
© www.soinside.com 2019 - 2024. All rights reserved.