写入 yaml 时如何删除元类信息?

How remove metaclasses info when writing to yaml?

import netifaces
import netaddr
import yaml


class Ethernet(yaml.YAMLObject):
    def __init__(self, addresses, gateway4, mtu, nameservers):
        self.nameservers = nameservers
        self.mtu = mtu
        self.gateway4 = gateway4
        self.addresses = addresses

我正在尝试将此 class 写入 yum 文件:

with open("/home/netplan.yaml", "w") as file:
    yaml.dump(document, file, default_flow_style=False)

我得到这个结果:

!!python/object:__main__.Netplan
network: !!python/object:__main__.Network
  ethernets:
    docker0: !!python/object:__main__.Ethernet
      addresses:
      - 172.26.0.1/16
      gateway4: 1.1.1.1
      mtu: 9000

如何删除所有元信息,例如 !!python/object:main. 来自 yaml 文件?

我不知道 yum 是什么,但我假设您说的是 YAML。

您可以定义一个 class 属性 yaml_tag 来控制序列化您的 class 时使用的标签。如果设置为映射的默认标签,则不会写入:

from yaml.resolver import BaseResolver

class Ethernet(yaml.YAMLObject):
    yaml_tag = BaseResolver.DEFAULT_MAPPING_TAG

    def __init__(self, addresses, gateway4, mtu, nameservers):
        self.nameservers = nameservers
        self.mtu = mtu
        self.gateway4 = gateway4
        self.addresses = addresses

但是请注意,如果您这样做,您将无法再次将 YAML 加载到此 class 中。

如果您无法控制转储的类型,您可以改为为它们注册一个自定义表示器:

yaml.add_representer(Foo, lambda dumper, data: dumper.represent_mapping(
    BaseResolver.DEFAULT_MAPPING_TAG, data.__dict__))