Python Literal[] 类型提示详解

Python Literal\[\] 类型提示详解


一、什么是 Literal

Literaltyping 模块提供的类型提示,用于限定变量或参数只能取指定的字面值

python 复制代码
from typing import Literal

二、基本用法

1. 限定变量值

python 复制代码
status: Literal["active", "inactive"] = "active"  # ✅
status: Literal["active", "inactive"] = "pending"  # ❌ 类型检查报错

2. 限定函数参数

python 复制代码
def set_mode(mode: Literal["read", "write", "append"]) -> None:
    ...

set_mode("read")   # ✅
set_mode("delete") # ❌ 类型检查报错

3. 限定返回值

python 复制代码
def get_direction() -> Literal["left", "right"]:
    return "left"  # ✅

三、常见使用场景

1. API 请求方法

python 复制代码
import requests
from typing import Literal

def request(url: str, method: Literal["GET", "POST", "PUT", "DELETE"] = "GET"):
    return requests.request(method, url)

2. 配置选项

python 复制代码
def configure(debug: Literal[True, False] = False):
    if debug:
        print("调试模式")

3. 状态机

python 复制代码
OrderStatus = Literal["pending", "paid", "shipped", "delivered", "cancelled"]

def update_status(status: OrderStatus) -> None:
    print(f"状态更新为: {status}")

4. 与 Enum 结合

python 复制代码
from enum import Enum

class Color(Enum):
    RED = "red"
    GREEN = "green"
    BLUE = "blue"

def paint(color: Literal[Color.RED, Color.GREEN, Color.BLUE]):
    ...

四、类型检查工具支持

工具 支持情况
Mypy ✅ 完全支持
Pyright ✅ 完全支持
PyCharm ✅ 完全支持
VS Code ✅ 完全支持
bash 复制代码
# 使用 mypy 检查
pip install mypy
mypy your_script.py

五、进阶用法

1. 与 Union 组合

python 复制代码
from typing import Union

def process(value: Union[int, Literal["auto", "manual"]]):
    ...

2. 嵌套使用

python 复制代码
Config = Literal[
    {"debug": True},
    {"debug": False}
]

3. 在数据类中使用

python 复制代码
from dataclasses import dataclass

@dataclass
class User:
    name: str
    role: Literal["admin", "user", "guest"]

六、注意事项

事项 说明
运行时无约束 Literal 仅在静态检查时生效,运行时可赋任意值
仅限字面值 只能是字符串、数字、布尔、None 等字面量
不支持变量 x = "a"; Literal[x] 无效
类型擦除 运行时无法获取 Literal 的具体值
python 复制代码
# 运行时不会报错
status: Literal["active"] = "invalid"  # 类型检查报错,但运行正常

七、对比其他方案

python 复制代码
# ❌ 不推荐:用 Enum
class Status(Enum):
    ACTIVE = "active"
    INACTIVE = "inactive"

# ✅ 推荐:用 Literal(更简洁)
Status = Literal["active", "inactive"]

# ❌ 不推荐:用 Union
Mode = Union[str, int]  # 太宽泛

# ✅ 推荐:用 Literal(更精确)
Mode = Literal["read", "write"]  # 更明确

总结Literal[] 是 Python 类型系统中实现字面量类型约束的利器,让代码更安全、可读性更强、IDE 补全更精准。

相关推荐
花酒锄作田9 小时前
FastAPI 使用 session 认证
python·fastapi
lsswear9 小时前
Python 并发 线程
开发语言·python
郑州光合科技余经理9 小时前
国际版外卖系统:税率字段怎么和订单主流程解耦
android·java·开发语言·前端·后端·php·ai编程
软件课代表CiCi10 小时前
运行库是什么?电脑缺运行库怎么办?c++运行库缺失修复全攻略
开发语言·c++·windows·电脑·dll修复·dll丢失·运行库
Ivanqhz10 小时前
MLIR OpBuilder
开发语言·python·mlir
红宝村村长11 小时前
windows笔记本双系统ubuntu设置
开发语言
威联通安全存储11 小时前
TS-h2287XU-RP 在家电制造总装与质检数据场景的部署
python·制造
泡泡鱼(敲代码中)12 小时前
Python 字符串 str 完整学习笔记
python·学习
troy12812 小时前
Python 基础语法(八):Web 后端开发、数据分析与可视化、网络爬虫、人工智能 / 大模型应用
前端·python·数据分析
菜鸟~noob23312 小时前
【电子战】第15篇:混合定位——TDOA/FDOA/AOA 联合【含matlab代码】
开发语言·matlab