如何将Python type hints限制为仅允许STATUS_CHOICES元组中的有效值
解决方案
方案1:使用typing.Literal(Python 3.8+ 支持)
你可以直接把可选的状态值定义为字面量联合类型,静态类型检查工具会自动校验传参是否在合法范围内,改动成本最低:
from typing import Literal # 合法状态值的字面量类型 StatusType = Literal[1, 2, 3] def my_method(status: StatusType): ...
方案2:使用Django内置枚举类(推荐,Django 3.0+ 支持)
你可以把原来的STATUS_CHOICES元组替换为Django的IntegerChoices枚举子类,不仅能获得更严格的类型提示,还能避免硬编码数字、提升代码可读性:
from django.db import models from django.utils.translation import gettext_lazy as _ # 定义状态枚举 class Status(models.IntegerChoices): DRAFT = 1, _("draft") PRIVATE = 2, _("private") PUBLISHED = 3, _("published") # 模型字段定义调整 class MyModel(models.Model): status = models.PositiveSmallIntegerField( _("status"), choices=Status.choices, default=Status.DRAFT ) # 方法类型提示直接使用枚举类 def my_method(status: Status): # 调用时可以直接传Status.DRAFT、Status.PRIVATE等枚举成员 ...
注意:类型提示仅做静态校验,如果需要运行时也保证入参合法,可以在方法内增加校验逻辑:
def my_method(status: Status): if status not in Status.values: raise ValueError(f"非法状态值: {status},可选值为{list(Status.values)}") ...
内容的提问来源于stack exchange,提问作者vmonteco
相关产品推荐
相关产品推荐

