python中定义带类型提示的函数需用def+冒号声明参数类型、箭头声明返回类型,如def greet(name: str, age: int) -> str:;类型提示不影响运行,仅供mypy等工具静态检查。

Python 中定义带类型提示的函数,核心是用 def 语法 + 冒号声明参数类型、箭头声明返回类型,不加运行时强制检查,但能被 mypy、IDE 和 pylance 识别并校验。
参数和返回值怎么写类型注解?
直接在参数名后加 : type,函数末尾用 -> type 声明返回类型:
def greet(name: str, age: int) -> str:
return f"Hello {name}, you are {age} years old"
常见类型包括 str、int、float、bool、list、dict 等。注意:list 和 dict 需配合泛型(如 list[int]),否则会被视为不完整类型提示。
-
list单独写等价于list[Any],多数静态检查器会报error: Need type annotation for "xxx" - Python 3.9+ 可直接用内置容器类型,如
list[str];旧版本需从typing导入:from typing import List, Dict - 可选参数用
Optional[T](或 Python 3.10+ 的T | None)
什么时候必须用 typing 模块?
基础类型够用时不用导入;但以下情况必须引入 typing(或 Python 3.9+ 的标准库等价物):
- 复合结构:如
Dict[str, List[int]](3.9+ 可写dict[str, list[int]]) - 联合类型:Python 3.10 前写
Union[str, int],之后推荐str | int - Callable 类型:如
Callable[[int, str], bool]表示接受int和str、返回bool的函数 - Literal 类型:如
Literal["GET", "POST"]限定字符串字面量
注意:typing.TypeVar 和 Generic 用于泛型函数,实际项目中容易误用导致 mypy 报错,建议先用具体类型,再逐步抽象。
默认参数和可变参数的类型怎么标?
默认参数不影响类型写法,但类型必须覆盖所有可能传入的值(包括 None):
def connect(host: str, port: int = 8080, timeout: float | None = None) -> bool:
...
可变参数分两种:
-
*args: tuple[int, ...]—— 表示任意长度的int元组(不是list!) -
**kwargs: dict[str, Any]—— 键为str,值类型不确定时用Any,但尽量避免,优先明确字段(如用TypedDict)
常见坑:*args: int 是错的,会触发 error: Expected single argument type;**kwargs: str 也不合法,必须是映射类型。
类型提示会影响运行吗?
完全不会。Python 解释器忽略所有类型提示,它们只在静态检查阶段起作用:
- 不加
from __future__ import annotations(Python 3.7+)时,复杂类型(如list[dict[str, int]])会在模块导入时求值,可能引发前向引用问题 - 加了该导入后,所有注解转为字符串,延迟到
mypy或 IDE 解析时处理,推荐在新项目中启用 - 运行时想获取类型信息?得用
typing.get_type_hints(func),但注意它会自动解析字符串注解,且对前向引用敏感
真正容易被忽略的是:类型提示一旦写错(比如把 str 写成 String),mypy 会静默跳过该参数校验,而不是报错——因为 String 被当成未定义标识符,退化为 Any。务必确认拼写和导入是否正确。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











