如何为通用工厂方法创建类型提示?

时间:2017-02-14 13:03:07

标签: python python-3.x type-hinting

如何声明类型提示以指示函数返回作为参数传递的类引用的实例?

声明如下似乎不对,因为它表明返回的类型与参数的类型相同:

from typing import TypeVar


T = TypeVar('T')

def my_factory(some_class: T) -> T:
    instance_of_some_class = some_class()
    return instance_of_some_class

使用示例:

class MyClass:
    pass

my_class = my_factory(MyClass)  # Inferred type should be MyClass

2 个答案:

答案 0 :(得分:5)

根据PEP-484,正确的方法是使用Type[T]作为参数:

from typing import TypeVar, Type


T = TypeVar('T')

def my_factory(some_class: Type[T]) -> T:
    instance_of_some_class = some_class()
    return instance_of_some_class

然而,我的编辑似乎还没有支持这一点。

答案 1 :(得分:0)

我试着玩:

class my_factory(Generic[T]):
    def __call__(self) -> T:
        return T()

旨在能够写作

a_string = my_factory[str]()

但无法正常工作。

我实际上要解决的问题是在创建泛型时,例如我想做的事情:

class queue_factory(Generic[T]):
    def __call__(self, size: int) -> Queue[T]:
        return Queue[T](size)

q = queue_factory[str](10)

也许比我自己更熟练的人可以更进一步并使其起作用。我失败了,而是做了:

def queue_factory(self, element_type: Type[T], size: int) -> Queue[T]:
    return Queue[T](size)

q = queue_factory(str, 10)

请注意,element_type参数没有使用,在运行时会被忽略,它仅用于类型检查。