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