You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:45:02