В Python 3.7, как я могу проверить, что x = typing.List [str] "of" typing.List? - PullRequest
0 голосов
/ 08 сентября 2018

Я храню информацию о типе в переменной x:

x = typing.List[str]

Позже, это x передается вместе с x_value, и я хочу переключить логику в зависимости от того, имеет ли x значение typing.List. Я знаю, что typing не следует использовать вместе с isinstance и issubclass, поэтому я говорю, что имеет . Есть ли какой-нибудь стандартный, перспективный (и Python 3.6) способ сделать это issubtype?

import sys
from typing import List


def issubtype(sub_type, parent_type):
    if sys.version_info >= (3, 7):
        if not hasattr(sub_type, '__origin__') or not hasattr(parent_type, '__origin__'):
            return False

        if sub_type.__origin__ != parent_type.__origin__:
            return False

        if isinstance(parent_type.__args__[0], type):
            return sub_type.__args__ == parent_type.__args__

        return True

    else:
        if not hasattr(sub_type, '__extra__') or not hasattr(parent_type, '__extra__'):
            return False

        if sub_type.__extra__ != parent_type.__extra__:
            return False

        if not parent_type.__args__ or parent_type.__args__ == sub_type.__args__:
            return True

    return False


assert issubtype(List[str], List[str])
assert issubtype(List[str], List)
assert issubtype(List[int], List[int])
assert not issubtype(List[int], List[str])

Пытаясь реализовать это, я понимаю, что любое хорошее решение должно было бы рекурсивно проверять аргументы (чего не делает моя попытка, но для меня достаточно просто знать, является ли вещь списком).

...