Python:输入一个接收类型并返回该类型实例的泛型函数

Posted

技术标签:

【中文标题】Python:输入一个接收类型并返回该类型实例的泛型函数【英文标题】:Python: typing a generic function that receives a type and returns an instance of that type 【发布时间】:2021-08-13 13:09:07 【问题描述】:

我想在 Python 函数中添加类型,该函数将类型作为参数(实际上是特定类的子类型),并返回该类型的实例。考虑一个将特定类型作为参数的工厂,例如:

T = TypeVar('T', bound=Animal)

def make_animal(animal_type: Type[T]) -> T:  # <-- what should `Type[T]` be?
    return animal_type()

(显然这是一个非常简单的例子,但它演示了案例)

这感觉应该是可能的,但我找不到如何正确输入提示。

【问题讨论】:

【参考方案1】:

这样的事情怎么样?

from __future__ import annotations
from typing import Type


class Animal:
    ...


def make_animal(animal_type: Type[Animal]) -> Animal:
    return animal_type()

【讨论】:

【参考方案2】:

不确定您的问题是什么,您发布的代码是完全有效的 Python 代码。 typing.Type 正是你想要的:

from typing import Type, TypeVar

class Animal: ...
class Snake(Animal): ...

T = TypeVar('T', bound=Animal)

def make_animal(animal_type: Type[T]) -> T:
    return animal_type()

reveal_type(make_animal(Animal))  # Revealed type is 'main.Animal*'
reveal_type(make_animal(Snake))   # Revealed type is 'main.Snake*'

在 mypy-play 上查看 mypy 输出。

【讨论】:

我不知道为什么我错过了,谢谢

以上是关于Python:输入一个接收类型并返回该类型实例的泛型函数的主要内容,如果未能解决你的问题,请参考以下文章

返回此数组的泛型类型的类型提示数组

如何判断我的泛型类型是不是支持某个接口并为函数来回转换到该接口? [复制]

是否可以在 TypeScript 中传播独特的泛型类型?

模拟任何给定类型参数的泛型方法调用

返回另一个泛型类型的泛型类型

创建其构造函数需要参数的泛型类型的实例?