Я пытаюсь создать собственный тип в модуле набора текста Python 3.7. Новый тип (скажем, Struct
) должен быть таким же, как тип tuple
. В Python3 .6 я смог сделать то же самое с помощью Typing.GenericMeta
и typing.TupleMeta
.
С модулем ввода, обновленным в Python3 .7, GenericMeta
и TupleMeta
не существуют, и специальный класс, который я хотел бы создать подклассом, невозможен. например, _VariadicGenericAlias
.
То, что я действительно хочу, похоже на:
Struct = _VariadicGenericAlias(tuple, (), , inst=False, special=True)
и
assert _origin(Struct[int, str]) == Struct
Примечание:
def _origin(typ: Any) -> Any:
"""Get the original (the bare) typing class.
Get the unsubscripted version of a type. Supports generic types, Union,
Callable, and Tuple. Returns None for unsupported types. Examples::
get_origin(int) == None
get_origin(ClassVar[int]) == None
get_origin(Generic) == Generic
get_origin(Generic[T]) == Generic
get_origin(Union[T, int]) == Union
get_origin(List[Tuple[T, T]][int]) == list
"""
if isinstance(typ, _GenericAlias):
return typ.__origin__ if typ.__origin__ is not ClassVar else None
if typ is Generic:
return Generic
return None