python-3.x 获取子类的泛型参数

djmepvbi  于 2023-01-03  发布在  Python
关注(0)|答案(2)|浏览(167)

我有一个泛型基类,我希望能够检查它提供的类型。我的方法是使用typing.get_args,其工作原理如下:

from typing import Generic, Tuple, TypeVarTuple, get_args

T = TypeVarTuple("T")

class Base(Generic[*T]):
    values: Tuple[*T]

Example = Base[int, str]
print(get_args(Example)) # (<class 'int'>, <class 'str'>)

但是当我继承类的时候,我得到了一个空的参数列表,如下所示:

class Example2(Base[int, str]):
    pass

print(get_args(Example2)) # ()

我真正需要的是知道values属性应该是什么类型,我可能有错误的方法,但是我也尝试过使用typing.get_type_hints,它似乎只是返回Tuple[*T]作为类型。
那么我怎样才能得到类型化参数呢?
编辑:我需要知道 class 的类型,而不是对象。

8qgya5xd

8qgya5xd1#

get_args__orig_bases__一起使用:

print(get_args(Example2.__orig_bases__[0]))  # prints "(<class 'int'>, <class 'str'>)"

为方便起见,您可以将泛型类型参数存储在__init_subclass__挂钩中:

from typing import Generic, TypeVarTuple, get_args

T = TypeVarTuple("T")

class Base(Generic[*T]):
    values: tuple[*T]
    type_T: tuple[type, ...]

    def __init_subclass__(cls) -> None:
        cls.type_T = get_args(cls.__orig_bases__[0])  # type: ignore

class Example2(Base[int, str]):
    pass

print(Example2.type_T)  # prints "(<class 'int'>, <class 'str'>)"
q0qdq0h2

q0qdq0h22#

您还可以使用python函数

help(package.class)

来检索类的文档。这不会直接返回所有可能的参数,但所有可能的参数都应该在返回中列出。
这将为您提供可用的参数,除非它要求只检索参数以插入其他内容,在这种情况下,这可能不是您要查找的内容。

相关问题