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

如何在Python类型标注中创建可参数化的自定义类型

参数化Factory类型的实现方法

你需要的可泛型参数化的工厂类型,不需要逐个通过NewType定义,直接借助Python typing模块的泛型能力即可实现,不同Python版本对应写法如下:

Python 3.9 ~ 3.11 版本实现

先声明泛型类型变量,再直接给Factory赋值为对应泛型的Callable别名即可:

from typing import Callable, TypeVar

T = TypeVar("T")
# 定义泛型工厂类型:支持任意参数输入,返回值类型为参数化指定的T
Factory = Callable[..., T]

定义完成后就可以直接用你期望的写法做类型标注:

  • 返回列表的工厂:Factory[list],等价于你之前定义的ListFactory
  • 返回字典的工厂:Factory[dict],等价于你之前定义的DictFactory
  • 针对自定义类型也可以直接使用,比如自定义类User对应的工厂直接写Factory[User]即可,无需提前单独声明新类型。

Python 3.12+ 版本简化实现

Python 3.12引入了原生类型别名语法,可以省略显式TypeVar声明,写法更简洁:

from typing import Callable

type Factory[T] = Callable[..., T]

该写法和上面3.9~3.11版本的实现效果完全一致,主流类型检查工具(mypy、pyright)均已支持。

严格类型区分场景实现

如果你需要让Factory类型和普通的Callable做严格区分(避免普通用途的可调用对象被误识别为工厂),可以借助Protocol定义专属的工厂协议:

from typing import TypeVar, Protocol

T = TypeVar("T")

class Factory(Protocol[T]):
    def __call__(self, *args, **kwargs) -> T: ...

这种实现的语义和Callable别名完全一致,但类型辨识度更高,适合在大型项目中明确标注工厂模式的使用场景。

注意:你之前使用NewType创建的是和原类型完全独立的新类型,而上述两种泛型实现属于类型别名,语义上就是对应签名的可调用对象,更符合你想要统一参数化写法的需求。

内容的提问来源于stack exchange,提问作者thorwhalen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:06:27