簡體   English   中英

ruamel.yaml可以編碼枚舉嗎?

[英]Can ruamel.yaml encode an enum?

以下對我來說不起作用,使用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文檔

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值。

我認為你需要通過值傳遞枚舉。

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

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

擴展答案添加@classmethod,在傳遞時調用.value

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

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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM