MyPy -Fehler, [Typ] hat kein Attribut [Methode]
Posted: 19 May 2025, 08:57
Ich habe eine abstrakte Basisklasse: < /p>
Und jetzt eine konkrete untergeordnete Klasse, die von parent2 abstrakte Klasse erbt:
und eine andere konkrete untergeordnete Klasse, die von Parent1 Klasse erbt:
Jetzt versuche ich, einen generischen Container zu erstellen, der alle Instanzen von Parent1 Klasse
enthält ohne Assert isInstance oder gegossen meldet einen Fehler, der besagt, dass
So beheben Sie das Problem ohne Verwendung von Assert ISInstance oder typing.cast oder auch ohne den # Typ: Ignore Kommentar?
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?