Code: Select all
import abc
import typing as t
class Parent1(abc.ABC):
...
< /code>
und eine Unterklasse dieser abstrakten Basisklasse, das selbst eine abstrakte Basisklasse ist: < /p>
class Parent2(Parent1):
@abc.abstractmethod
def method2(self) -> None:
...
Code: Select all
class Child1(Parent2):
def method2(self) -> None:
pass
Code: Select all
class Child2(Parent1):
pass
enthält
Code: Select all
T = t.TypeVar("T")
class Container(t.Generic[T]):
def __init__(self) -> None:
self._containers: t.Dict[str, T] = {}
def add_item(self, name: str, item: T) -> None:
# reveal_type(item)
self._containers[name] = item
def get_item(self, name: str) -> T:
return self._containers[name]
< /code>
container: Container[Parent1] = Container()
container.add_item("child1", Child1())
container.add_item("child2", Child2())
< /code>
child1 = container.get_item("child1")
# assert isinstance(child1, Child1)
# reveal_type(child1) # Revealed type is "generic1.Parent1"
child1.method2()
# t.cast(Child1, child1).method2()
< /code>
When trying to run mypy --strict
Code: Select all
error: "Parent1" has no attribute "method2"
So beheben Sie das Problem ohne Verwendung von Assert ISInstance oder typing.cast oder auch ohne den # Typ: Ignore Kommentar?