Python 3类型,自定义variadic泛型类型,包含任意数量的类型,如何?

时间:2017-09-29 11:08:55

标签: python-3.x types typing variadic

typing.Tuple可以与任意数量的类型参数一起使用,例如Tuple[int, str, MyClass]Tuple[str, float]。我如何实现我自己的类,可以这样使用?我理解如何继承typing.Generic。以下代码演示了这一点。

from typing import TypeVar, Generic


T = TypeVar("T")


class Thing(Generic[T]):
    def __init__(self, value: T):
        self.value = value


def f(thing: Thing[int]):
    print(thing.value)


if __name__ == '__main__':
    t = Thing("WTF")
    f(t)

上面的代码可以工作,但是类型检查器(在我的例子中是PyCharm)会发现t应该是Thing[int]类型而不是Thing[str]这一事实。这一切都很好,但是如何使类Thing支持任意数量的类型参数,如Tuple呢?

1 个答案:

答案 0 :(得分:0)

  • 在您的示例中,t的类型为Thing,而不是Thing[str]。因此,此对象接受T
  • 的任何内容
  • 您可以像这样对其进行参数化:t2 = Thing[str]("WTF")
  • 现在,对于您的问题,我认为您希望使用typing.Union,如下所示:t3=Thing[Union[str,int,float]]("WTF")

顺便说一句,您可以使用typing_inspect中的get_generic_type()来检查泛型的类型

>>> get_generic_type(t)
__main__.Thing
>>> get_generic_type(t2)
__main__.Thing[str]
>>> get_generic_type(t3)
__main__.Thing[typing.Union[str, int, float]]