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 能在开发期揪出大量类型错误,项目越大收益越明显。