Создание псевдонима типа Union[List[T], Array[T]]
должно работать:
from typing import TypeVar, Union, List
T = TypeVar('T')
Array = Union[List[T], numpy.ndarray[T]]
def foo(bar: Array[int]) -> None: pass
См. Документы mypy по псевдонимам универсального типа для получения дополнительной информации об этой технике.
Этот код может потенциально потерпеть неудачу во время выполнения, так как numpy.ndarray
на самом деле не является подписанным во время выполнения, только в мире подсказок типов.Вы можете обойти это, спрятав свой собственный подсказка типа за защитой typing.TYPE_CHECKING
, которая всегда ложна во время выполнения и истинна во время проверки типа.
Вы можете сделать это относительно чисто в Python 3.7 +:
from __future__ import annotations
from typing import TypeVar, Union, List, TYPE_CHECKING
if TYPE_CHECKING:
T = TypeVar('T')
Array = Union[List[T], numpy.ndarray[T]]
def foo(bar: Array[int]) -> None: pass
Вы должны заключить Array[int]
в строку для более старых версий Python 3, однако:
from typing import TypeVar, Union, List, TYPE_CHECKING
if TYPE_CHECKING:
T = TypeVar('T')
Array = Union[List[T], numpy.ndarray[T]]
def foo(bar: "Array[int]") -> None: pass
Обратите внимание, что при попытке создать свой собственный Array
подсказка типа путем объединения нескольких других подсказок типа во время выполнения вряд ли сработает: инструменты статического анализа, такие как mypy, работают, фактически анализируя ваш код без его запуска: на самом деле он не собирается пытаться что-либо оценить внутри вашего пользовательского Array
класса.
В общем, попытка «использовать» подсказки типов во время выполнения может быть сопряжена с опасностью: на самом деле они предназначены только для использования в качестве подсказок типа.
Наконец, вы, кажется, неправильно понимаете, для чего NewType
.Я рекомендую прочитать соответствующие документы для получения дополнительной информации .