Python 范型Typing速查


下面我把你给出的内容 整合 + 精简 + 结构化 成一份完整、连贯的 typing 模块功能介绍,适合直接作为笔记或文档使用 👇



Python typing 模块功能简要介绍

typing 模块用于为 Python 提供类型注解(Type Hints),帮助静态类型检查工具(如 mypy、pyright)提升代码的安全性、可读性和可维护性,尤其在大型项目中非常重要。



一、基础与通用类型

1️⃣ Any

Any 表示任意类型,使用它会关闭类型检查。

from typing import Any

def process(value: Any) -> Any:
    return value

⚠️ 警告:应尽量避免大量使用 Any,否则会失去类型检查的意义。



2️⃣ Union

Union 表示多个类型中的一种。

from typing import Union

def process(value: Union[int, str]) -> str:
    return str(value)


3️⃣ Optional

Optional[X] 等价于 Union[X, None],用于表示可能为 None 的值

from typing import Optional

def greet(name: Optional[str]) -> str:
    return "Hello, guest!" if name is None else f"Hello, {name}!"


二、容器类型

from typing import List, Tuple, Set, Dict
  • List[T]:同类型列表
  • Tuple[T1, T2]:固定长度、可不同类型
  • Set[T]:同类型集合
  • Dict[K, V]:键值对字典
def process_numbers(nums: List[int]) -> int:
    return sum(nums)


三、迭代相关类型

from typing import Iterable, Iterator, Generator
  • Iterable[T]:可迭代对象
  • Iterator[T]:迭代器(有 __next__)
  • Generator[Y, S, R]:生成器(yield 类型)
def get_numbers() -> Generator[int, None, None]:
    yield 1
    yield 2


四、函数与类相关类型

4️⃣ Callable

描述可调用对象(函数、方法)。

from typing import Callable

def apply_fn(fn: Callable[[int, int], int], a: int, b: int) -> int:
    return fn(a, b)


5️⃣ Type

用于表示某个类本身的类型

from typing import Type

def create_instance(cls: Type[int]) -> int:
    return cls(42)


五、泛型相关(重点)

6️⃣ TypeVar

用于定义类型变量,实现泛型函数或类。

from typing import TypeVar, List

T = TypeVar('T')

def first_element(lst: List[T]) -> T:
    return lst[0]


7️⃣ Generic

用于定义泛型类,通常和 TypeVar 搭配使用。

from typing import Generic, TypeVar

T = TypeVar('T')

class Box(Generic[T]):
    def __init__(self, value: T):
        self.value = value

    def get(self) -> T:
        return self.value


8️⃣ ClassVar

用于标注类属性(非实例属性)

from typing import ClassVar

class MyClass:
    category: ClassVar[str] = "demo"
    value: int


六、常量与值约束

9️⃣ Literal

限制变量只能取指定常量值

from typing import Literal

def move(direction: Literal["up", "down", "left", "right"]) -> str:
    return f"Moving {direction}"


🔟 Final

表示变量或属性不应被重新赋值或继承

from typing import Final

PI: Final = 3.14159


七、结构化与特殊用途

1️⃣1️⃣ TypedDict

为字典定义固定结构

from typing import TypedDict

class User(TypedDict):
    name: str
    age: int


1️⃣2️⃣ NoReturn

表示函数不会正常返回(通常直接抛异常)。

from typing import NoReturn

def raise_error() -> NoReturn:
    raise RuntimeError("error")

八、定义类型:NewType

可以使用NewType定义一个新的类型, 如下实现了不混用user_id和task_id(虽然都是int):

from dataclasses import dataclass
from typing import NewType

TaskId = NewType("TaskId", int)
UserId = NewType("UserId", int)

@dataclass(frozen=True, slots=True)
class Task:
    task_id: TaskId
    user_id: UserId

🧠 现在类型系统能做到什么?

task = Task(task_id=TaskId(1), user_id=UserId(2))

❌ 下面这行 IDE 会直接报错:

Task(task_id=UserId(1), user_id=TaskId(2))

🧩 为什么 NewType 是对的,而 TypeVar 不行?


工具作用
TypeVar泛型占位符(行为流动)
NewType语义标签(领域概念)

一句话记忆:

TypeVar 是“将来再说” NewType 是“现在就区分”

九、Python 3.10+ 新语法

1️⃣3️⃣ UnionType(| 运算符)

def process(value: int | str) -> str:
    return str(value)

等价于:

Union[int, str]


总结速览

typing 模块核心能力:

  • 🧱 基础类型:Any, Union, Optional
  • 📦 容器类型:List, Tuple, Set, Dict
  • 🔁 迭代类型:Iterable, Iterator, Generator
  • 🧠 泛型支持:TypeVar, Generic, ClassVar
  • 🔒 约束能力:Literal, Final
  • 🧾 结构定义:TypedDict
  • 🚫 特殊语义:NoReturn
  • ✨ 新语法:X | Y

这些工具让 Python 在保持灵活性的同时,具备接近静态语言的类型安全能力,在中大型项目中尤为重要。

文章标签:

评论(0)