如何获得Generic [T]子类的成员变量的实际声明类型

时间:2019-04-25 03:17:39

标签: python python-3.x typing

我正在尝试获取Generic Type变量的实型。我尝试了很多方法,但是,没有一个看起来有希望。

以下是体现我的问题的最少代码:

from typing import *
T = TypeVar('T')

class G(Generic[T]):
    x: T = None

class R(G[int]):
    pass

我想在运行时获取R.x的真实类型。我的第一次尝试是使用get_type_hints。它给

{'x': ~T}

看起来不是很有用。

我也尝试过使用R.__orig_bases__。它确实有一些东西:

(__main__.G[int],)

但是将基类类型的参数与成员变量对齐太复杂了。

你们有没有办法在运行时获得R.x的真实类型?有可能吗?

1 个答案:

答案 0 :(得分:0)

好吧,考虑到R是专门继承G[int]的,因此实际上并不需要在运行时获取内部类型:您知道它是特别的int,因此您可以在各处进行硬编码。

您也可以随时执行type(instance_of_r.x)。大概,您以确保已用正确类型的值实例化R.__init__的方式定义了x,因此您可以直接查询它。

但是,如果您尝试使用G[...]的多个子类,其中每个子类以不同的方式参数化G[...],则可以修改G的定义以坚持每个子类指定您要使用的类型。例如,也许您可​​以做这样的事情:

from typing import *
T = TypeVar('T')

class G(Generic[T]):
    x_type: ClassVar[Type[T]]
    x: T = None

class R(G[int]):
    x_type = int

class S(G[str]):
    x_type = str

然后,您可以执行instance_of_g.x_type来获取适当的类型。

您也许可以结合使用这两个答案-例如,可以设置G的构造函数,使其对给出的type(...)的任何值调用x