Как проверить тип TypeVar во время выполнения

У меня есть общий класс Graph[Generic[T], object].
Мой вопрос, есть ли какая-нибудь функция, которая возвращает тип, переданный как общий класс Graph

>>> g = Graph[int]()
>>> magic_func(g)
<class 'int'>

person jastor_007    schedule 08.03.2020    source источник


Ответы (1)


Вот один из способов добиться этого, который работает в 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()

Выход:

<class 'int'>
<class 'str'>

Если вы хотите, чтобы тип внутри __new__ или __init__ становился немного сложнее, см. Следующий пост для получения дополнительной информации: Базовый класс [T] - как получить тип T из экземпляра?

Изменить

Кажется, что библиотеки pytypes предоставляют метод, который позволяет получить orig_class даже из init, проверьте метод get_orig_class, доступный здесь: https://github.com/Stewori/pytypes/blob/master/pytypes/type_util.py

person Isma    schedule 08.08.2020