Python3 类型注解

Python 是动态类型语言,变量可以随时换类型,灵活但容易出错:项目一大,"这个函数到底该传什么"只能靠猜。类型注解(PEP 484)给参数、返回值与变量标注类型,不改变运行行为,却让 IDE 补全、静态检查和大项目维护舒服得多。

动态类型的问题

def add(a, b):
    return a + b

print(add(1, 2))      # 输出:3
print(add("1", "2"))  # 输出:12  —— 字符串也能加,可能不是本意

调用方传错类型往往要等运行时才暴露,甚至不报错只得到奇怪结果。

函数注解

在参数后写 : 类型,括号后写 -> 返回类型,函数意图一目了然:

def add(a: int, b: int) -> int:   # 两个 int 参数,返回 int
    return a + b

def greet(name: str) -> str:
    return "你好," + name

变量注解

变量声明时也可标注类型,帮助 IDE 推断:

age: int = 25
name: str = "张三"
scores: list = [90, 88]      # 3.9+ 可直接用小写内置类型

typing 常用类型

容器与可空类型通常从 typing 导入(3.9+ 也可写 list[int] 等,typing 写法兼容旧版本):

from typing import List, Dict, Tuple

def process(ids: List[int],            # int 组成的列表
            table: Dict[str, int],     # 键 str、值 int 的字典
            pair: Tuple[str, int]) -> None:   # 二元组,无返回值
    pass

Optional / Union / Any

可能为 None 用 Optional;可能是几种之一用 Union;不关心类型用 Any:

from typing import Optional, Union, Any

def find(key: str) -> Optional[int]:      # 返回 int 或 None
    ...

def calc(x: Union[int, float]) -> float:  # x 是 int 或 float 之一
    return float(x)

data: Any = "什么类型都行"

Python 3.10+ 提供更简洁写法:int | None 等价 Optional[int],str | int 等价 Union[str, int]。

mypy:静态类型检查

注解本身不拦截错误,需用工具检查。安装并运行 mypy,不改代码就能发现类型不匹配:

pip install mypy
mypy demo.py     # 无输出表示通过;有错会指出文件、行号与原因

运行时完全不影响

注解只记录在 annotations 中,程序行为不变:

def greet(name: str) -> str:
    return "你好," + name

print(greet(123))              # 输出:你好,123(传错类型也能运行)
print(greet.__annotations__)   # 输出:{'name': <class 'str'>, 'return': <class 'str'>}

小结:类型注解不改变运行,却让接口意图清晰、IDE 提示更智能;配合 mypy 能在开发期揪出大量类型错误,项目越大收益越明显。

笔记加载中…