首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ruamel.yaml能编码一个枚举吗?

ruamel.yaml能编码一个枚举吗?
EN

Stack Overflow用户
提问于 2017-12-29 04:14:44
回答 2查看 2.9K关注 0票数 3

使用Python3.4.7,ruamel.yaml版本0.15.35,下面的内容不适用于我:

代码语言:javascript
复制
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

代码语言:javascript
复制
Neutral: <Speed.Neutral: 1>

.dump()提出:

代码语言:javascript
复制
ruamel.yaml.representer.RepresenterError: cannot represent an object: <enum 'Speed'>

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-29 07:25:14

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

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

代码语言:javascript
复制
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)

这意味着:

代码语言:javascript
复制
!Speed Neutral-1
...

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

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

票数 7
EN

Stack Overflow用户

发布于 2017-12-29 04:40:45

我想你需要用价值来传递枚举。

https://docs.python.org/3/library/enum.html#programmatic-access-to-enumeration-members-and-their-attributes

代码语言:javascript
复制
yaml.dump(Speed.Neutral.value, sys.stdout)

扩展应答以添加@classmethod,该方法在传递时调用.value

http://yaml.readthedocs.io/en/latest/dumpcls.html

代码语言:javascript
复制
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))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48017317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档