Python中如何定义函数级别的泛型(非类泛型)?
Python中如何定义泛型函数(适配mypy类型检查)
当然可以实现,Python支持泛型函数的定义,且能完美适配mypy的类型检查规则,主要有两种写法,对应不同的Python版本:
1. Python 3.9+ 简洁写法(PEP 604 语法)
这和你尝试的写法一致,Python 3.9及以上版本支持直接用方括号[T]标注函数的泛型参数,mypy完全兼容这种语法:
from typing import TypeVar # 定义泛型类型变量,可添加约束(比如bound限制T的范围) T = TypeVar('T') def get_info_from_toml[T](section: str) -> T: # 示例:从toml解析数据,需保证返回值匹配T的类型 parsed_data = parse_toml_section(section) # 如果解析逻辑能明确对应T类型,直接返回即可;若需类型转换,用cast告知mypy合法性 return parsed_data
使用时,只需要在调用时指定类型注解,mypy会自动推断泛型参数:
# mypy会推断T为dict类型,检查返回值是否符合 config: dict = get_info_from_toml("app_config")
2. 兼容旧版本Python的写法
如果需要兼容Python 3.8及以下版本,可以省略方括号标注,直接在返回值中使用TypeVar,通过mypy的类型推断识别泛型:
from typing import TypeVar, cast T = TypeVar('T') def get_info_from_toml(section: str) -> T: parsed_data = parse_toml_section(section) # 使用cast告知mypy:此处转换为T类型是合法的(仅用于类型检查,无运行时影响) return cast(T, parsed_data)
关键注意事项
- 避免无约束的类型转换:如果你的解析逻辑只能返回特定类型,可给TypeVar添加约束,比如
T = TypeVar('T', bound=str | int | dict),这样mypy会限制T的合法范围,避免任意类型转换。 - 泛型函数的核心是让mypy能明确推断T的类型:调用时尽量通过变量注解或显式类型参数(Python 3.9+支持
get_info_from_toml[dict]("config"))指定类型,确保类型检查准确。
内容的提问来源于stack exchange,提问作者Rodrigo Farias Rezino
相关产品推荐
相关产品推荐

