You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 19:57:19