gpt4 book ai didi

python - ruamel.yaml 可以编码枚举吗?

转载 作者:太空宇宙 更新时间:2023-11-03 13:30:23 46 4
gpt4 key购买 nike

使用 Python 3.4.7,ruamel.yaml 版本 0.15.35,以下内容对我不起作用:

import sys
import enum

import ruamel.yaml
from ruamel.yaml import yaml_object
yaml = ruamel.yaml.YAML()

@yaml_object(yaml)
class Speed(enum.IntEnum):
Reverse = 0
Neutral = 1
Low = 2
Drive = 3
Park = 999

print("Neutral:", repr(Speed.Neutral))

yaml.dump(Speed.Neutral, sys.stdout)

我得到一个完全合理的repr:

Neutral: <Speed.Neutral: 1>

但是 .dump() 引发:

ruamel.yaml.representer.RepresenterError: cannot represent an object: <enum 'Speed'>

如果不支持 enum,我可以做些什么来扩展我正在使用的 enum 类(或子类 enum.IntEnum 我已经创建了),例如一个 dunder 方法?

最佳答案

enum 不支持开箱即用,主要是因为默认的 dump 方法是安全的,因此不支持任意 Python 对象。这种安全性也将 enum 类型从标准库中排除。

您应该做的是将 to_yaml classmethod 添加到您的 Speed 类,如 ruamel.yaml documentation 中所述:

import sys
import enum

import ruamel.yaml
from ruamel.yaml import yaml_object
yaml = ruamel.yaml.YAML()

@yaml_object(yaml)
class Speed(enum.IntEnum):
Reverse = 0
Neutral = 1
Low = 2
Drive = 3
Park = 999

@classmethod
def to_yaml(cls, representer, node):
return representer.represent_scalar(
u'!Speed',
'{}-{}'.format(node._name_, node._value_)
)

yaml.dump(Speed.Neutral, sys.stdout)

给出:

!Speed Neutral-1
...

您当然可以根据自己的喜好调整字符串表示形式(并添加一个 from_yaml 以便能够将输出加载回来)。

请注意,您不能像文档示例中那样添加 yaml_tag,因为这会干扰 enum 值。

关于python - ruamel.yaml 可以编码枚举吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48017317/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com