Python函数类型提示需在参数后加: type、返回值用-> type,内置类型直接写,可选类型用str | None(3.10+)或Optional[str],无返回值必须写-> None,容器类型用list[str](3.9+)或List[str](旧版),联合类型优先用|,变量初始化需显式标注以防推导为Any。

怎么给函数参数和返回值加类型提示
Python 的类型提示不是运行时强制的,而是给编辑器、静态检查工具(比如 mypy)看的。加对了,IDE 能自动补全、提前报错;加错了,可能让 mypy 报一堆无关错误。
最常用的是在参数后加 : type,返回值用 -> type:
def greet(name: str, age: int) -> str:
return f"Hello {name}, you're {age} years old"-
str、int、bool、float这些内置类型直接写,不用引号 - 如果类型是可选的(比如可能为
None),用Optional[str]或更推荐的str | None(Python 3.10+) - 函数没有返回值时,必须写
-> None,不能省略或写成-> void(会报错) - 参数有默认值不影响类型写法,但默认值类型要和声明一致,比如
name: str = "anon"没问题,name: int = "anon"会被mypy拦住
List、Dict 这类容器类型怎么写才不被 mypy 报错
直接写 list 或 dict 是不带元素类型的“裸类型”,mypy 默认不认——它需要知道你存的是什么。得用 typing 模块里的泛型,或者 Python 3.9+ 的内置泛型。
常见写法对比:
立即学习“Python免费学习笔记(深入)”;
# Python 3.9+ def process_items(items: list[str], config: dict[str, int]) -> None: ... <h1>Python 3.8 及更早(必须导入)</h1><p>from typing import List, Dict def process_items(items: List[str], config: Dict[str, int]) -> None: ...
-
list[str]和List[str]功能一样,但前者更简洁;不过低版本 Python 不支持,得看项目最低版本 - 嵌套类型别写太深,比如
dict[str, list[tuple[int, str]]]虽然合法,但可读性差、容易括号配对出错;复杂结构建议用TypedDict或定义NamedTuple - 空列表字面量
[]类型推导很弱,mypy常推成list[<i>Any</i>],最好显式标注变量类型:items: list[str] = []
什么时候必须用 typing.Union 或 | 符号
当一个变量、参数或返回值可能有多种类型,又不想退化成 Any,就得明确列出所有可能类型。Python 3.10 引入的 | 是语法糖,和 Union 等价,但更轻量。
def parse_value(raw: str | int | float) -> int | None:
try:
return int(raw)
except (ValueError, TypeError):
return None-
str | int在 Python 3.10+ 可用;老版本只能用Union[str, int](记得从typing导入) - 不要写
Union[str, int, None],直接用str | int | None或Optional[str | int](后者等价于Union[str | int, None]) -
isinstance(x, (str, int))这种运行时判断,不会影响类型检查;mypy仍会按声明的联合类型来校验后续用法
为什么加了类型提示,mypy 还是报 “Cannot determine type”
这不是语法错,而是 mypy 在某些上下文里“看不穿”你的逻辑,典型场景包括:动态属性访问、未标注的变量初始化、模块级循环引用、以及没启用严格模式。
- 函数内首次赋值没标注类型,比如
result = [],mypy推成list[Any],后续append(42)就可能报错;应写成result: list[int] = [] - 用字符串做类名(比如
"User")做类型注解时,得用引号包裹,否则解释器找不到这个类:def get_user() -> "User": ... - 跨文件引用类型时,如果 A.py 导入了 B.py,B.py 又反向导入 A.py,
mypy可能无法解析;改用字符串前向引用或from __future__ import annotations(Python 3.7+)推迟求值 - 默认的
mypy检查比较宽松,很多隐式Any不报错;加--disallow-untyped-defs和--disallow-incomplete-defs才能真正发挥类型提示作用
类型提示本身不改变运行行为,但它依赖你主动告诉工具“你打算怎么用”。漏掉一个 : str,可能让整个函数体的检查失效——这点比语法错误更难定位。










