【python 内置模块】typing

2024-01-20 00:00:00

目录:

typing 模块介绍

typing 模块是自 Python 3.5 版本引入的标准库模块,用于支持类型提示(Type Hints)或类型注解。

核心目的是让开发者能够在代码中明确地标注变量、函数参数和返回值的预期类型,从而提高代码的可读性、可维护性,并借助第三方静态类型检查工具(如 mypy、pyright)在开发阶段发现潜在的类型错误

Python 运行时不会强制执行这些类型注解,它们主要服务于开发工具和静态分析器,不会改变 Python 作为动态类型语言的本质特性。

基础类型注解

最基本的用法是使用 Python 内置类型(如 int, str, list)进行标注。

如下示例:在函数 greeting 中,参数 name 被注解为 str 类型,返回值也被注解为 str 类型

# 变量注解
name: str = "Alice"
age: int = 30

# 函数参数与返回值注解
def greeting(name: str) -> str:
    return 'Hello ' + name

复杂类型注解

对于列表、字典等容器,typing 模块提供了泛型注解,以指明容器内元素的类型。

from typing import List, Dict, Tuple, Set, Optional, Union

# 指明列表元素为整数
numbers: List[int] = [1, 2, 3]
# 指明字典键为字符串,值为浮点数
scores: Dict[str, float] = {"Alice": 95.5, "Bob": 88.0}
# 指明元组每个位置的类型
point: Tuple[float, float, str] = (10.5, 20.3, "origin")
# 指明集合元素类型
unique_numbers: Set[int] = {1, 2, 3}

# Union: 表示可以是多种类型之一
def process_value(value: Union[int, str]) -> None:
    if isinstance(value, int):
        print(f"整数: {value}")
    else:
        print(f"字符串: {value}")

# Optional: 表示可以是某种类型或 None,等价于 Union[Type, None]
def find_user(user_id: int) -> Optional[str]:
    users = {1: "Alice", 2: "Bob"}
    return users.get(user_id)  # 可能返回 str 或 None

Python 3.10 可以使用 | 操作符代替 Union。例如,int | str 等价于 Union[int, str]

类型别名

对于复杂的类型注解,可以创建类型别名来简化代码,提高可读性。

from typing import List, Tuple

# 将 List[float] 定义为 Vector 别名
Vector = List[float]

def scale(scalar: float, vector: Vector) -> Vector:
    return [scalar * num for num in vector]

# 使用别名
new_vector = scale(2.0, [1.0, -4.2, 5.4])

泛型

泛型允许编写与特定类型无关的通用代码。通过 TypeVar 定义类型变量,结合 Generic 基类来创建泛型类。

from typing import TypeVar, Generic, List

T = TypeVar('T')  # 声明一个类型变量 T

class Stack(Generic[T]):
    def __init__(self) -> None:
        self.items: List[T] = []

    def push(self, item: T) -> None:
        self.items.append(item)

    def pop(self) -> T:
        return self.items.pop()

# 使用泛型类
int_stack: Stack[int] = Stack()
int_stack.push(1)
print(int_stack.pop())  # 输出: 1

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

Any 类型

Any 是一种特殊的类型,静态类型检查器会认为所有类型都与 Any 兼容,Any 也与所有类型兼容。

from typing import Any

def process_any(value: Any) -> Any:
    # 可以对 value 进行任何操作,类型检查器不会报错
    return value

创建新类型

NewType 用于创建与原类型在逻辑上不同、但在运行时等价的新类型,有助于静态类型检查器捕捉逻辑错误。

from typing import NewType

# 创建 UserId 类型,本质仍是 int
UserId = NewType('UserId', int)
some_id = UserId(524313)

def get_user_name(user_id: UserId) -> str:
    ...

# 类型检查通过
user_a = get_user_name(UserId(42351))

# 类型检查失败:int 不能直接当作 UserId
user_b = get_user_name(-1)

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: