my-django/utils/enum.py
Kai 5d9073c19c
Some checks failed
test / build (push) Has been cancelled
test / deploy (push) Has been cancelled
test / release (push) Has been cancelled
first commit
2025-03-21 17:45:04 +08:00

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, "中部")