136 lines
2.9 KiB
Python
136 lines
2.9 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
枚举
|
|
"""
|
|
import enum
|
|
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
if hasattr(enum, "EnumType"):
|
|
from enum import EnumType
|
|
|
|
EnumType._check_for_existing_members_ = lambda _, __: _
|
|
|
|
|
|
class EnumMem:
|
|
"""
|
|
枚举成员类
|
|
"""
|
|
|
|
def __init__(self, value, desc, deprecated=False):
|
|
"""
|
|
:param value: 枚举值
|
|
:param desc: 枚举值的描述
|
|
:param deprecated: 弃用
|
|
"""
|
|
self.value = value
|
|
self.desc = desc
|
|
self.deprecated = deprecated
|
|
|
|
|
|
class EnumMeta:
|
|
@classmethod
|
|
def __enum__(cls, *args):
|
|
mem = args[0]
|
|
__enum_dict__ = getattr(cls, "__enum_dict__", {})
|
|
__enum_deprecated_dict__ = getattr(cls, "__enum_deprecated_dict__", {})
|
|
|
|
if isinstance(mem, EnumMem):
|
|
__enum_dict__[mem.value] = mem.desc
|
|
__enum_deprecated_dict__[mem.value] = getattr(mem, "deprecated", False)
|
|
value = mem.value
|
|
else:
|
|
value = mem
|
|
cls.__enum_dict__ = __enum_dict__
|
|
cls.__enum_deprecated_dict__ = __enum_deprecated_dict__
|
|
return value
|
|
|
|
def __str__(self):
|
|
return str(self._value_)
|
|
|
|
@classmethod
|
|
def values(cls):
|
|
"""
|
|
所有枚举值
|
|
:return: 所有枚举值
|
|
"""
|
|
return getattr(cls, "__enum_dict__").keys()
|
|
|
|
@classmethod
|
|
def dict(cls):
|
|
"""
|
|
所有枚举值, 以及说明
|
|
:return: 枚举值-说明
|
|
"""
|
|
return getattr(cls, "__enum_dict__")
|
|
|
|
@classmethod
|
|
def desc(cls, member):
|
|
"""
|
|
获取对某个值的描述
|
|
:param member: 枚举值
|
|
:return: 说明
|
|
"""
|
|
|
|
enum_dict = cls.dict()
|
|
value = enum_dict.get(member)
|
|
if value is None:
|
|
return _("未知的状态码")
|
|
|
|
return value
|
|
|
|
@classmethod
|
|
def deprecated(cls, member) -> bool:
|
|
"""
|
|
获取已弃用的枚举值
|
|
:return: bool
|
|
"""
|
|
|
|
return cls.__enum_deprecated_dict__.get(member, False)
|
|
|
|
|
|
class IntEnum(EnumMeta, int, enum.Enum):
|
|
"""
|
|
枚举类
|
|
"""
|
|
|
|
def __new__(cls, *args):
|
|
value = cls.__enum__(*args)
|
|
member = int.__new__(cls, value)
|
|
member._value_ = value
|
|
return member
|
|
|
|
|
|
class FloatEnum(EnumMeta, float, enum.Enum):
|
|
"""
|
|
枚举类
|
|
"""
|
|
|
|
def __new__(cls, *args):
|
|
value = cls.__enum__(*args)
|
|
member = float.__new__(cls, value)
|
|
member._value_ = value
|
|
return member
|
|
|
|
|
|
class StrEnum(EnumMeta, str, enum.Enum):
|
|
def __new__(cls, *args):
|
|
value = cls.__enum__(*args)
|
|
member = str.__new__(cls, value)
|
|
member._value_ = value
|
|
return member
|
|
|
|
|
|
Enum = IntEnum
|
|
|
|
if __name__ == "__main__":
|
|
|
|
class Test(Enum):
|
|
"""
|
|
使用EnumMem值的枚举
|
|
"""
|
|
|
|
TOP = EnumMem(1, "顶部")
|
|
MID = EnumMem(2, "中部")
|