如何为接受任意Pydantic Role子类的函数添加Mypy类型提示?
正确为接受Pydantic基类或子类的函数添加Mypy类型提示
如果你需要写一个能接收Role类或其任意派生Pydantic模型的函数,直接用Role或BaseModel做类型注解会触发Mypy的“类型不兼容”错误,又不想用Union挨个枚举所有子类,那用Type[Role]就能解决问题。
错误写法示例
from pydantic import BaseModel class Role(BaseModel): name: str class AdminRole(Role): permissions: list[str] # 直接用Role做注解会报错,因为函数接收的是类而非实例 def process_role(role_cls: Role): instance = role_cls(name="test") print(instance) process_role(AdminRole) # Mypy报错:Argument 1 to "process_role" has incompatible type "Type[AdminRole]"; expected "Role"
问题出在:Role作为类型注解表示的是该类的实例,但我们传入的是类本身(比如AdminRole是类对象,不是实例),类型自然不匹配。
正确写法示例
from typing import Type from pydantic import BaseModel class Role(BaseModel): name: str class AdminRole(Role): permissions: list[str] # 用Type[Role]表示接受Role类或其任意子类 def process_role(role_cls: Type[Role]): instance = role_cls(name="test") print(instance) process_role(AdminRole) # Mypy不再报错
原理说明
Type[T]是Python typing模块提供的类型,用来表示类本身的类型,而非类的实例。这里Type[Role]允许传入Role类或者任何继承自Role的子类,完全符合需求,不用手动枚举所有子类。
内容的提问来源于stack exchange,提问作者Tommy
相关产品推荐
相关产品推荐

