Я храню информацию о типе в переменной 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])
Пытаясь реализовать это, я понимаю, что любое хорошее решение должно было бы рекурсивно проверять аргументы (чего не делает моя попытка, но для меня достаточно просто знать, является ли вещь списком).