Если я правильно понял, все, что вам нужно, это TypeVar
экземпляр как
from typing import TypeVar, Union
class SomeClass:
...
OtherType = TypeVar('OtherType')
MyType = Union[SomeClass, OtherType]
def foo(x: MyType[int]) -> int:
return x ** 2
с кодом, подобным этому, помещенным в test.py
модуль
$ mypy test.py
дает мне
test.py:13: error: Unsupported operand types for ** ("SomeClass" and "int")
test.py:13: note: Left operand is of type "Union[SomeClass, int]"
и с исправлением в foo
def foo(x: MyType[int]) -> int:
if isinstance(x, SomeClass):
return 0
return x ** 2
проблем нет.
Примечания
Если нам это действительно нужно тип псевдонима, который я назвал примерно так:
SomeClassOr = Union[SomeClass, OtherType]
, поскольку
SomeClassOr[int]
кажется мне более читабельным, чем
MyClass[int]
Ссылка