原文作者:我辈李想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。
前言
枚举是一组符号名称(枚举成员)的集合,枚举成员应该是唯一的、不可变的。在枚举中,可以对成员进行恒等比较,并且枚举本身是可迭代的。
一、枚举示例
在 Python 中,可以使用 enum
模块来实现枚举。具体可以按照以下步骤进行:
- 导入
enum
模块
from enum import Enum
- 创建枚举类
class Weekday(Enum):
Monday = 1
Tuesday = 2
Wednesday = 3
Thursday = 4
Friday = 5
Saturday = 6
Sunday = 7
- 使用枚举类
print(Weekday.Monday) # Weekday.Monday
print(Weekday.Monday.value) # 1
print(Weekday(1)) # Weekday.Monday
print(Weekday(1).name) # Weekday.Monday
print(Weekday['Monday']) # Weekday.Monday
print(Weekday['Monday'].value) # Weekday.Monday
结果
Weekday.Monday
1
Weekday.Monday
Monday
Weekday.Monday
1
二、枚举转字典
这里主要说的是,有些枚举的内容需要双向使用。
from enum import Enum, unique
# 继承枚举类,unique确保唯一的枚举值
@unique
class MissionEnum(Enum):
"""卫星代码"""
BC1 = '66'
BC2 = '77'
BC3 = '88'
@classmethod
def dict_n_v(cls):
return {m.name: m.value for m in cls}
@classmethod
def dict_v_n(cls):
return {m.value: m.name for m in cls}
if __name__ == '__main__':
print(MissionEnum.dict_n_v())
print(MissionEnum.dict_v_n())
print(MissionEnum.dict_n_v().get('BC1'))
三、枚举的应用
Python 枚举是一种用于定义固定值的数据类型,它可以使代码更加可读、可维护和可扩展。下面是一些 Python 枚举的常见应用场景:
状态机管理:状态机是一种有限状态自动机,用于描述系统的行为,例如网络协议、操作系统等。Python 枚举可以用来管理状态机中的状态和事件。
API 接口参数:API 接口通常需要指定一些固定值的参数,例如 HTTP 请求方法、文件访问模式等等。Python 枚举可以用来定义这些参数,提高代码的可读性和可维护性。
数据库字段类型:数据库表中的字段通常需要指定数据类型,例如整数、字符串、日期等等。Python 枚举可以用来定义这些数据类型,避免硬编码,并提高代码的可读性和可维护性。
程序配置管理:程序配置通常需要指定一些固定值,例如日志级别、调试模式、邮件服务器等等。Python 枚举可以用来定义这些配置项,提高代码的可读性和可维护性。
单元测试:在单元测试中,我们常常需要使用一些固定值来测试代码的正确性。Python 枚举可以用来定义这些测试数据,提高测试代码的可读性和可维护性。
总之,Python 枚举是一种非常实用的数据类型,可以使代码更加清晰、易读和易维护。它可以用来管理状态机、API 接口参数、数据库字段类型、程序配置和单元测试等等。
四、Django的model选项
1.model文件中的应用
from django.db import models
class OrderType(models.TextChoices):
"""订单类型"""
ACCOUNT = 0, _('账户变动')
ORDER = 1, _('存档订单')
MISSION = 2, _('编程订单')
class Order(models.Model):
otype = models.CharField(verbose_name='订单类型', max_length=1, choices=OrderType.choices,
default=OrderType.ORDER) # 1: 存档订单;2:编程订单
2.views文件的使用
order = Order(
user_id=request.user.id,
pic_id=pic.id,
otype =OrderType.ORDER)
五、drf接口枚举
# response_result.py
from enum import Enum
from rest_framework.response import Response
class ResponseMsg(Enum):
SUCCESS = 'success'
BAD_REQUEST = 'bad request'
UNAUTHORIZED = 'unauthorized'
FORBIDDEN = 'forbidden'
NOT_FOUND = 'not found'
SERVER_ERROR = 'server error'
class ResponseCode(Enum):
SUCCESS = 200
BAD_REQUEST = 400
UNAUTHORIZED = 401
FORBIDDEN = 403
NOT_FOUND = 404
SERVER_ERROR = 500
class ResponseResult:
"""
使用了DRF自带的Response类来封装返回结果。Response类在默认情况下会将数据序列化成JSON格式并返回,
可以自动设置HTTP响应头和状态码等信息,方便管理。在ResponseResult类中,我们加入了to_response方
法,将当前的ResponseResult实例转换成Response实例返回给DRF框架。此外,我们还对__getitem__和
__setitem__方法进行了重载,方便使用。
"""
def __init__(self, code=ResponseCode.SUCCESS, data=None, msg=ResponseMsg.SUCCESS):
self.code = code.value
self.data = data
self.msg = msg
def __getitem__(self, key):
return getattr(self, key)
def __setitem__(self, key, value):
setattr(self, key, value)
def to_response(self):
return Response(data=self.__dict__)