如何在运行时检查 TypeVar 的类型

jas*_*007 9 python generics static-typing python-typing

我有一个通用类Graph[Generic[T], object]
我的问题是,是否有任何函数返回作为泛型传递给类的类型Graph

>>> g = Graph[int]()
>>> magic_func(g)
<class 'int'>
Run Code Online (Sandbox Code Playgroud)

Ism*_*sma 7

这是实现此目的的一种方法,适用于 Python 3.6+(在 3.6、3.7 和 3.8 中进行了测试):

from typing import TypeVar, Generic

T = TypeVar('T')

class Graph(Generic[T], object):
    def get_generic_type(self):
        print(self.__orig_class__.__args__[0])


if __name__=='__main__':
    g_int = Graph[int]()
    g_str = Graph[str]()

    g_int.get_generic_type()
    g_str.get_generic_type()
Run Code Online (Sandbox Code Playgroud)

输出:

<class 'int'>
<class 'str'>
Run Code Online (Sandbox Code Playgroud)

如果您想获取内部类型__new__或者__init__事情变得有点棘手,请参阅以下帖子以获取更多信息:Generic[T] 基类 - 如何从实例内获取 T 的类型?

编辑

库 pytypes 似乎提供了一种允许__orig_class__从 获得偶数的方法,请检查此处可用的__init__方法:https: //github.com/Stewori/pytypes/blob/master/pytypes/type_util.pyget_orig_class