编程语言
首页 > 编程语言> > python – 通过PyYAML创建带别名的yaml文件

python – 通过PyYAML创建带别名的yaml文件

作者:互联网

我需要使用以下格式创建一个yaml文件:

imager: &imager
  type: "detector"
  half_angle: 75 degrees
  max_distance: 23000 meters
ownship: &ownship
  origin: [11,11,5]
  type: "uav"

vehicles:
  - <<: *ownship
  name: "uav1"
  origin: [35.69257148103399 degrees, -117.689417544709 degrees, 5500]
  sensors:
    - <<: *imager
      name: "imager1"

我将所有特定数据存储在Python类中,因此我想我会使用PyYAML来简化操作.但是,当我去阅读文档时,我没有提到如何使用PyYAML处理别名.这个功能是否存在,或者我应该继续创建自己的yaml作家?

解决方法:

首先,您指定的文件不正确YAML.它不会读入因为这里:

- <<: *ownship
name: "uav1"

并置一个顺序元素和一个映射元素,这是不允许的.如果你从第一行删除 – 你得到一个正确的YAML文件:

imager: &imager
  type: "detector"
  half_angle: 75 degrees
  max_distance: 23000 meters
ownship: &ownship
  origin: [11,11,5]
  type: "uav"

vehicles:
  - <<: *ownship
  name: "uav1"
  origin: [35.69257148103399 degrees, -117.689417544709 degrees, 5500]
  sensors:
    - <<: *imager
      name: "imager1"

你不能用PyYAML生成.

PyYAML确实支持读取和写入的锚点和引用.它确实支持merge key operator<<阅读但它不支持编写合并运算符. 这将需要比较不同的字典,确定是否有任何字典是另一个字典的完整子集(一个的所有键和值在另一个中),然后在子集上制作锚点并在写入另一个字典时添加合并运算符(而不是在子集中写密钥).
PyYAML中没有这样的代码,因为它比在PyYAML支持的共享复杂对象(dict,list等)上使用锚点和引用要复杂得多.

我的ruamel.yaml具有PyYAML功能的超集,它支持从版本0.10开始往返这些数据.它在第一次往返时做了一些“规范化”:

imager: &imager
  type: detector
  half_angle: 75 degrees
  max_distance: 23000 meters
ownship: &ownship
  origin: [11, 11, 5]
  type: uav
vehicles:
  <<: *ownship
  name: uav1
  origin: [35.69257148103399 degrees, -117.689417544709 degrees, 5500]
  sensors:
  - <<: *imager
    name: imager1

只需读取YAML并操作生成的数据结构然后将其写出即可.在您引用的字典上完成键的赋值,如果在引用的字典中不可用,则从第一个合并的字典透明地完成值的检索.

从头开始创建这样的结构然后转储它更加困难,因为没有支持例程来通过比较字典之间的键/值来创建合并.

标签:python,alias,yaml,pyyaml,cross-reference
来源: https://codeday.me/bug/20190609/1204297.html