Я пытаюсь определить пользовательский общий dict, ключи которого имеют тип T_key
, а значения имеют тип T_val
.
Я также хочу наложить ограничения на T_key
и T_val
, напримерчто T_key
может быть только типа A
или B
или их подкласса.
Как мне это сделать?
from typing import TypeVar, Generic
class A: ...
class B: ...
class Asub(A): ...
class Bsub(B): ...
T_key = TypeVar('T_key', A, B, covariant=True)
T_val = TypeVar('T_val', A, B, covariant=True)
class MyDict(Generic[T_key, T_val]): ...
w: MyDict[ A, B]
x: MyDict[ A, Bsub]
y: MyDict[Asub, B]
z: MyDict[Asub, Bsub]
Когда я пытаюсь это проверить, mypy даетошибки в аннотациях x
, y
и z
.Только аннотация для w
работает должным образом.
generic.py:17: error: Value of type variable "T_val" of "MyDict" cannot be "Bsub"
generic.py:18: error: Value of type variable "T_key" of "MyDict" cannot be "Asub"
generic.py:19: error: Value of type variable "T_key" of "MyDict" cannot be "Asub"
generic.py:19: error: Value of type variable "T_val" of "MyDict" cannot be "Bsub"
Я не понимаю, почему Asub
не является допустимым типом для T_key
, даже если указано covariant=True
.
Чего мне здесь не хватает?
mypy версия: 0.630