首页 > 编程语言 > 详细

自定义带描述字段的Python枚举

时间:2020-10-21 23:18:35      阅读:94      评论:0      收藏:0      [点我收藏+]
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-

__author__ = "Carp-Li"
__date__ = "2020/10/18"

from enum import Enum
from collections import namedtuple
from types import DynamicClassAttribute


T = namedtuple("Field", ["value", "desc"])


class FieldEnum(Enum):

    @DynamicClassAttribute
    def value(self):
        """ 直接获取namedtuple的value的值 """
        return self._value_.value

    @DynamicClassAttribute
    def desc(self):
        """ 直接获取namedtuple的desc的值 """
        return self._value_.desc

    @classmethod
    def by(cls, value):
        """ 根据value获取对应的枚举 """
        for field, enum in cls._value2member_map_.items():
            if value == field.value:
                return enum
        raise ValueError(f"{cls.__name__}(value={value}):没有对应的枚举")

    @classmethod
    def by_desc(cls, text):
        """ 根据desc获取对应的枚举 """
        for field, enum in cls._value2member_map_.items():
            if text == field.desc:
                return enum
        raise ValueError(f"{cls.__name__}(desc={text}):没有对应的枚举")

    @DynamicClassAttribute
    def field(self):
        """ 返回一个namedtuple """
        return self._value_

    @classmethod
    def iter_field(cls):
        """ 返回一个迭代器对象,方便遍历 """
        for field in cls._value2member_map_.keys():
            yield field


class Gender(FieldEnum):
    """ 一个例子 """
    MAN = T(1, "男")
    WOMAN = T(2, "女")
    NULL = T(0, "未知")


if __name__ == ‘__main__‘:
    print(Gender.by(0))
    print(Gender.by_desc("男"))

自定义带描述字段的Python枚举

原文:https://www.cnblogs.com/carp-li/p/13855179.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!