Вот минимальный пример, демонстрирующий проблему:
Код: Выделить всё
from typing import TypeVar, Protocol
# Type variables
T = TypeVar('T')
T_co = TypeVar('T_co', covariant=True)
T_contra = TypeVar('T_contra', contravariant=True)
# Class hierarchy
class Animal: pass
class Dog(Animal): pass
# Protocols
class Feeder(Protocol[T]):
def feed(self, animal: T) -> T: ...
class Adopter(Protocol[T_co]):
def adopt(self) -> T_co: ...
class Walker(Protocol[T_contra]):
def walk(self, animal: T_contra) -> None: ...
# Implementations
class AnimalFeeder:
def feed(self, animal: Animal) -> Animal: ...
class DogFeeder:
def feed(self, animal: Dog) -> Dog: ...
class AnimalAdopter:
def adopt(self) -> Animal: ...
class DogAdopter:
def adopt(self) -> Dog: ...
class AnimalWalker:
def walk(self, animal: Animal) -> None: ...
class DogWalker:
def walk(self, animal: Dog) -> None: ...
# Test cases with expected vs actual behavior
feeder1: Feeder[Dog] = DogFeeder() # Expected
feeder2: Feeder[Dog] = AnimalFeeder() # Expected
feeder3: Feeder[Animal] = DogFeeder() # Expected
adopter1: Adopter[Dog] = DogAdopter() # Expected
adopter2: Adopter[Dog] = AnimalAdopter() # Expected
adopter3: Adopter[Animal] = DogAdopter() # Expected
walker1: Walker[Dog] = DogWalker() # Expected
walker2: Walker[Dog] = AnimalWalker() # Expected
walker3: Walker[Animal] = DogWalker() # Expected
< /code>
Вопросы: < /strong> < /p>
Почему проверка типа Fearder3, когда он, по-видимому, нарушает инвариантность? < /li>
Почему Walker2 терпит неудачу, когда он должен быть действительным с противодействием? Это ограничение при проверке типа Pycharm?>
Подробнее здесь: https://stackoverflow.com/questions/793 ... eric-types