Yaml:结构注意事项(地图和列表元素)

时间:2019-05-22 22:02:30

标签: list dictionary yaml

我忽略的以下两个选项之间在可用性方面是否存在重大差异?我应该考虑的陷阱?

每种方法都可以很容易地解决,可以反复进行,等等。我觉得我似乎缺少明显的东西,因为现在,我唯一看到的就是化妆品。

---
db_instances_map:
    DB_01:
        host: db01.example.com
        port: 1521
        user: foo
        pass: bar

    DB_02:
        host: db02.example.com
        port: 1521
        user: foo
        pass: bar


db_instances_list:
    - service_name: DB_01
      host: db01.example.com
      port: 1521
      user: foo
      pass: bar

    - service_name: DB_02
      host: db02.example.com
      port: 1521
      user: foo
      pass: bar
...

编辑:发布此消息已经很晚了,但是我忘记承认的一件事是地址能力。如果您知道密钥,则无需遍历地图,而必须遍历列表以查找已知元素

1 个答案:

答案 0 :(得分:1)

第一个大区别是,如果由于某种原因程序在映射中处理键-值对的顺序很重要,那么作为YAML标准,您可能会遇到麻烦不保证程序内部顺序与文档中的顺序相同。 (某些解析器会保证此顺序,例如,我的ruamel.yaml是往返模式,对于其他解析器,则不能明确保证和/或可能取决于库的版本或语言的版本。)

第二个大不同是使用列表的示例更容易实现为标记对象,您可以并且可能应该这样做,以明确表明您正在加载数据库实例而不是带有某些实例的通用映射值:

db_instances_list:
    - !Database
      service_name: DB_01
      host: db01.example.com
      port: 1521
      user: foo
      pass: bar

    - !Database
      service_name: DB_02
      host: db02.example.com
      port: 1521
      user: foo
      pass: bar

这样做比起让某人根据根级键标量的内容来猜测,这五个键值对将被程序解释为{的属性(或实例化值), {1}}实例(我假设我对该键的解释是正确的)。

您可以使用按键上的标签来获得相同的效果:

Database

但是我不了解的任何YAML库本身都不支持该功能,因此,对于使用YAML文档的人们来说,这是远远不能识别的。