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

如何以最Pythonic的方式从Enum值创建Literal类型?

从Enum自动生成Literal类型

假设我们定义了如下Enum类:

from enum import Enum
from typing import Literal

class Suits(Enum):
    CLUBS = "CLUBS"
    DIAMONDS = "DIAMONDS"
    HEARTS = "HEARTS"
    SPADES = "SPADES"

如果需要基于该Enum的所有成员创建Literal类型,手动逐个枚举成员的方式在枚举规模大时既繁琐又容易出错。这里提供两种更高效的实现方式:

方法一:Python 3.10+ 类型解包语法

利用Python 3.10及以上版本支持的类型解包特性,直接将Enum的所有成员传入Literal:

Suit = Literal[*tuple(Suits)]

解释:Suits作为Enum类,迭代时会返回所有枚举成员,将其转为tuple后用*解包,即可自动将所有成员作为Literal的参数,无需手动逐个罗列。

方法二:兼容旧版本Python的动态构造

如果使用Python 3.9及以下版本,无法直接在类型中使用解包,可以通过Literal的底层构造方式实现:

import typing

# 生成包含所有Enum成员的元组
suit_members = tuple(Suits)
# 动态构造Literal类型
Suit = typing._LiteralGeneric(suit_members)

注意:_LiteralGeneric是typing模块的内部API,虽然能实现需求,但未来版本可能存在变动,优先推荐使用方法一。

补充说明

正如评论中提到的,多数场景下直接使用Suits作为类型注解进行类型检查更合理,但如果确实需要生成Literal类型,上述方法可以避免手动维护的麻烦。

内容的提问来源于stack exchange,提问作者doublethink13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:57:42