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

如何为接受任意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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:12:38