Сегодня я глубоко погрузился в Принцип замещения Лискова и ковариацию / контравариантность.
И застрял на разнице между:
T = TypeVar("T", bound=Union[A, B])
T = TypeVar("T", A, B, covariant=True)
Мое понимание # 1
Разница между TypeVar ('T', A, B) и TypeVar ('T', связанный = Союз [A, B])
Этот ответ четко гласит T
может быть:
Union[A, B]
(или объединение любых подтипов A
и B
, таких как Union[A, BChild]
) A
(или любой подтип A
) B
(или любой подтип B
)
Это имеет для меня смысл.
Мой Недостатки Понимание # 2
MyPy не позволяет ограниченным TypeVar быть ковариантными? Определение обобщенного c dict с ограниченным, но ковариантным типом key-val
Повторно упоминает случай bound=Union[A, B]
, но не понимает значение опции # 2, A, B, covariant=True
.
Я попытался поиграться с mypy
, и не могу понять это. Кто-нибудь может указать, что это значит?
Я думаю это означает:
A
(или любой подтип A
) B
(или любой подтип B
)
(он также исключает случай Union
сверху)
** Редактировать **
В комментариях спросили:
Вы уверены, что они на самом деле разные?
Вот пример кода, чтобы показать разницу. Ошибки происходят от mypy==0.770
.
from typing import Union, TypeVar, Generic
class A: pass
class ASub(A): pass
class B: pass
# Case 1... Success: no issues found
# T = TypeVar("T", bound=Union[A, B])
# Case 2... error: Value of type variable "T" of "SomeGeneric" cannot be "ASub"
T = TypeVar("T", A, B, covariant=True)
class SomeGeneric(Generic[T]): pass
class SomeGenericASub(SomeGeneric[ASub]): pass