首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Python typing使用

Python typing使用

作者头像
小田测测看
发布2026-06-17 18:05:36
发布2026-06-17 18:05:36
2210
举报

一、typing 库概述

typing 模块是 Python 3.5+ 引入的类型注解标准库,用于提供类型提示(Type Hints),提高代码可读性和可维护性,并支持静态类型检查工具。

二、基础类型注解

1. 基本类型

代码语言:javascript
复制
from typing importList, Dict, Tuple, Set, Optional, Union, Any

# 变量注解
name: str = "拾光"
age: int = 18
height: float = 1.75
is_student: bool = True
scores: list = [85, 90, 88]
detailed_scores: List[int] = [85, 90, 88] 


defgreet(name: str) -> str:
    returnf"Hello, {name}"

deflog_message(message: str) -> None:
    print(f"[LOG] {message}")

2. 集合类型

代码语言:javascript
复制
from typing importList, Dict, Tuple, Set, Sequence

names: List[str] = ["Alice", "Bob", "Charlie"]
matrix: List[List[int]] = [[1, 2], [3, 4]]

student: Dict[str, Union[str, int]] = {"name": "拾光", "age": 18}
config: Dict[str, Any] = {"host": "localhost", "port": 8080}

# 元组(固定长度和类型)
point: Tuple[float, float] = (10.5, 20.3)
person: Tuple[str, int, bool] = ("拾光", 18, True)

# 集合
unique_ids: Set[int] = {1, 2, 3, 4, 5}

# 序列(支持list、tuple等)
numbers: Sequence[int] = [1, 2, 3, 4]  # 也可以是 (1, 2, 3, 4)

三、高级类型注解

1. Optional 和 Union

代码语言:javascript
复制
from typing importOptional, Union

# Optional[T] 等价于 Union[T, None]
deffind_user(user_id: int) -> Optional[str]:
    users = {1: "拾光", 2: "拾光2"}
    return users.get(user_id)

# Union 表示有多个可能的类型
defprocess_data(data: Union[str, int, List[int]]) -> str:
    ifisinstance(data, str):
        returnf"字符串: {data}"
    elifisinstance(data, int):
        returnf"整数: {data}"
    else:
        returnf"列表: {data}"

# 类型别名
UserID = Union[int, str]
Response = Union[Dict[str, Any], List[Any], str, None]

2. Any 和 NoReturn

代码语言:javascript
复制
from typing importAny, NoReturn


defaccept_anything(value: Any) -> Any:
    return value


defraise_error(message: str) -> NoReturn:
    raise ValueError(message)

definfinite_loop() -> NoReturn:
    whileTrue:
        print("Running...")

3. Callable 类型

代码语言:javascript
复制
from typing importCallable, TypeVar

# 定义函数类型
MathOperation = Callable[[int, int], int]

defadd(a: int, b: int) -> int:
    return a + b

defmultiply(a: int, b: int) -> int:
    return a * b


defapply_operation(
    a: int, 
    b: int, 
    operation: Callable[[int, int], int]
) -> int:
    return operation(a, b)

result = apply_operation(5, 3, add)  # 返回 8

Processor = Callable[[str], List[str]]
Callback = Callable[[Dict[str, Any]], None]

4. TypeVar 和泛型

代码语言:javascript
复制
from typing import TypeVar, Generic, List, Optional


T = TypeVar('T')  # 任意类型
Num = TypeVar('Num', int, float)  # 限制为数字类型


deffirst_item(items: List[T]) -> Optional[T]:
    return items[0] if items elseNone

# 泛型类
classStack(Generic[T]):
    def__init__(self) -> None:
        self.items: List[T] = []
    
    defpush(self, item: T) -> None:
        self.items.append(item)
    
    defpop(self) -> Optional[T]:
        returnself.items.pop() ifself.items elseNone


int_stack = Stack[int]()
int_stack.push(1)
int_stack.push(2)

str_stack = Stack[str]()
str_stack.push("hello")

四、结构化类型注解

1. TypedDict

代码语言:javascript
复制
from typing import TypedDict, List

# Python 3.8+
classUser(TypedDict):
    id: int
    name: str
    email: str
    age: Optional[int]
    tags: List[str]


user: User = {
    "id": 1,
    "name": "拾光",
    "age": 18,
    "tags": ["vip", "active"]
}


defprocess_user(user: User) -> None:
    print(f"Processing {user['name']}")

# 继承TypedDict
classAdminUser(User):
    permissions: List[str]
    is_superuser: bool

2. NamedTuple

代码语言:javascript
复制
from typing import NamedTuple, Optional

classPoint(NamedTuple):
    x: float
    y: float
    z: Optional[float] = None

classPerson(NamedTuple):
    name: str
    age: int
    email: Optional[str] = None


p1 = Point(10.5, 20.3)
p2 = Point(5.0, 15.0, 3.0)
person = Person("拾光", 18, "zhangsan@example.com")

print(p1.x, p1.y)  # 10.5 20.3
print(person.name)  # 拾光

3. dataclass 结合 typing

python

代码语言:javascript
复制
from dataclasses import dataclass, field
from typing import List, Optional, ClassVar
from datetime import datetime

@dataclass
class Product:
    # 实例变量
    id: int
    name: str
    price: float
    tags: List[str] = field(default_factory=list)
    created_at: datetime = field(default_factory=datetime.now)
    description: Optional[str] = None
    
    # 类变量
    currency: ClassVar[str] = "CNY"
    
    def display_price(self) -> str:
        return f"{self.currency}{self.price:.2f}"

# 使用
product = Product(
    id=1,
    name="笔记本电脑",
    price=5999.99,
    tags=["电子", "电脑"]
)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 一、typing 库概述
  • 二、基础类型注解
    • 1. 基本类型
    • 2. 集合类型
  • 三、高级类型注解
    • 1. Optional 和 Union
    • 2. Any 和 NoReturn
    • 3. Callable 类型
    • 4. TypeVar 和泛型
  • 四、结构化类型注解
    • 1. TypedDict
    • 2. NamedTuple
    • 3. dataclass 结合 typing
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档