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

如何为根据传入类返回动态类型的Python函数设置类型标注?

为动态实例化函数添加类型标注

这个场景正好需要用到Python的泛型类型标注,因为我们要让类型检查器(比如mypy、Pyright)明确:传入的是某个类,返回的就是该类的实例。下面是具体的实现方式:

基础实现(兼容Python 3.8+)

首先导入泛型相关的类型工具,然后定义泛型变量来关联输入类和返回实例的类型:

from typing import TypeVar, Type

# 定义一个泛型变量T,代表任意类型的实例
T = TypeVar('T')

def foo(cls: Type[T]) -> T:
    return cls()

各部分解释:

  • TypeVar('T'):创建一个泛型类型变量T,它可以绑定到任意具体类型(比如str、自定义类MyClass等)。
  • Type[T]:用来标注参数cls的类型,表示这是一个能创建T类型实例的类对象。
  • -> T:标注返回值类型为T,也就是传入类的实例类型,这样类型检查器就能准确推断返回值的类型。

更简洁的Python 3.9+写法

从Python 3.9开始,你可以改用collections.abc中的Type,写法逻辑和上面一致:

from collections.abc import Type
from typing import TypeVar

T = TypeVar('T')

def foo(cls: Type[T]) -> T:
    return cls()

实际使用示例

当你调用这个函数时,类型检查器会自动推断返回实例的类型:

class User:
    def __init__(self) -> None:
        self.name = "default"

user = foo(User)
# 此时类型检查器会识别user的类型是User,能正确提示它的属性和方法

注意:这个标注隐含了传入的类必须支持无参数实例化(即__init__方法没有必填参数)。如果你的函数后续要支持带参数的类实例化,需要进一步调整标注(比如结合Callable),但针对当前的cls()实现,上面的标注已经完全够用了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:55:34