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