Как создавать собственные типы с помощью модуля набора текста? - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь создать собственный тип в модуле набора текста 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

1 Ответ

0 голосов
/ 29 мая 2020

Принял решение, которое сработало для меня. Использован параметр name, который был где-то спрятан в _GenericAlias:

Struct = _VariadicGenericAlias(tuple, (), , inst=False, special=True, name="Struct")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...