写入 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__))
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__))