Python ruamel.yaml可以对枚举进行编码吗?

Python ruamel.yaml可以对枚举进行编码吗?,python,enums,ruamel.yaml,Python,Enums,Ruamel.yaml,对于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 Dri

对于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)
我得到了一个完全合理的
报告

Neutral: <Speed.Neutral: 1>

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

我想您需要按值传递枚举

扩展答案,添加@classmethod,在传递时调用.value


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

您应该做的是将
添加到_yaml
classmethod
Speed
类中,如下所述:

其中:

!Speed Neutral-1
...
当然,您可以根据自己的喜好调整字符串表示(并从_yaml添加一个
,以便能够重新加载输出)


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

这是一种解决方法,但它会丢失类型信息,因为我只是在编码一个int。yaml能够为其他对象保留类型和值。感觉它应该能够为enum这样做。如果我们没有访问该类的权限该怎么办。例如,如果我们使用第三方lib中的数据会怎么样?我们必须手动将枚举转换为字符串/整数吗?如果您没有访问类的权限,则无法使用它,因此不需要转储它。如果您有权访问某个类,但无法更新/扩展它所在的
.py
,则有其他方法使该类“已知”给
ruamel.yaml
。对于我来说,这是一个很好的问题,但不是一个合适的评论。我通过电子邮件收到任何标记为ruamel.yaml的新问题的通知,无需通过评论通知我。
yaml.dump(Speed.Neutral.value, sys.stdout)
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'!enum:', u'{.value}'.format(node))
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
...