jaxtyping предоставляет аннотации типов, которые используют str
в качестве параметра (в отличие от типа), например:
Float[Array, "dim1 dim2"]
Допустим, я хотел бы создать псевдоним типа, который объединяет части Float
и Array
.
Это означает, что я хотел бы иметь возможность писать
MyOwnType["dim1 dim2"]
вместо.
Насколько я понимаю, я не могу использовать TypeAlias
/TypeVar
, поскольку общий параметр (здесь "dim1 dim2"
) является не типом, а фактически экземпляром типа.
Есть ли краткий питонический способ добиться этого?
Обновлено:
Я попробовал следующее, и это не работает:
class _Singleton:
def __getitem__(self, shape: str) -> Float:
return Float[Array, shape]
MyOwnType = _Singleton()
Использование аннотации параметра функции MyOwnType["dim1 dim2"]
as дает жалобу mypy
Variable "MyOwnType" is not valid as a type
Решение:
Судя по ответу @chepner, это было окончательное решение:
class MyOwnType(Generic[Shape]):
def __class_getitem__(cls, shape: str) -> Float:
return Float[Array, shape]
Вам необходимо переопределить/определить __class_getitem__, а не __getitem__
(это относится к экземплярам _Singleton
, а не к самому _Singleton
).
class _Singleton:
def __class_getitem__(self, shape: str) -> Float:
return Float[Array, shape]
Кроме того, мне нужен был класс, унаследованный от Generic
, иначе mypy
пожаловался бы на "dim1 dim2"
. Я добавил свое окончательное решение вопроса.
Метод переопределения —
__class_getitem__
, а не__getitem__
.