如何在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
相关产品推荐
相关产品推荐

