by Guest » 27 Jan 2025, 08:04
Warum meldet mypy einen Fehler im folgenden Code:
Code: Select all
from typing import Self, reveal_type, Protocol
class A:
def dup(self) -> list[Self]:
return [self, self]
class B:
def dup(self) -> list[Self]:
return [self, self]
class C:
def dup(self) -> list[Self]:
return [self, self]
class HasDup(Protocol):
def dup(self) -> list[Self]: ...
def process[T: A | B | C](elem: T) -> list[T]:
reveal_type(elem.dup)
duplicated: list[T] = elem.dup()
return duplicated
process(A())
process(B())
process(C())
< /code>
Der Fehler lautet: < /p>
main.py:25: error: Incompatible types in assignment (expression has type "list[A] | list[B] | list[C]", variable has type "list[T]") [assignment]
< /code>
Wenn ich t: a | ersetze B | C
mit T: Hasdup oder t: (a, b, c) , dann wird der Fehler nicht mehr gemeldet.
ist das a Einschränkung von MyPy? Es scheint mir wie a | B | C ist ein Subtyp von Hasdup .
Warum meldet mypy einen Fehler im folgenden Code:
[code]from typing import Self, reveal_type, Protocol
class A:
def dup(self) -> list[Self]:
return [self, self]
class B:
def dup(self) -> list[Self]:
return [self, self]
class C:
def dup(self) -> list[Self]:
return [self, self]
class HasDup(Protocol):
def dup(self) -> list[Self]: ...
def process[T: A | B | C](elem: T) -> list[T]:
reveal_type(elem.dup)
duplicated: list[T] = elem.dup()
return duplicated
process(A())
process(B())
process(C())
< /code>
Der Fehler lautet: < /p>
main.py:25: error: Incompatible types in assignment (expression has type "list[A] | list[B] | list[C]", variable has type "list[T]") [assignment]
< /code>
Wenn ich t: a | ersetze B | C [/code] mit T: Hasdup oder t: (a, b, c) , dann wird der Fehler nicht mehr gemeldet.
ist das a Einschränkung von MyPy? Es scheint mir wie a | B | C ist ein Subtyp von Hasdup .