Python generische Typevar, die an die generische Basisklasse gebunden ist

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Python generische Typevar, die an die generische Basisklasse gebunden ist

by Anonymous » 23 Feb 2025, 23:23

Sag, ich habe eine python -abstrakte Klasse in der Form: < /p>

Code: Select all

class AbcClass(ABC, Generic[T]): ...
< /code>
mit einigen Implementierungen: < /p>
class IntClass(AbcClass[int]): ...
class StrClass(AbcClass[str]): ...
class FloatClass(AbcClass[float]): ...
Dann möchte ich eine Funktion foo haben, die in einer Instanz einer der Unterklassen und eines Werts, der mit der Art der Generika dieser Unterklasse entspricht, einnimmt. Zum Beispiel: < /p>

Code: Select all

def foo(obj: IntClass, value: int) -> None: ...
def foo(obj: StrClass, value: str) -> None: ...
def foo(obj: FloatClass, value: float) -> None: ...
Ich versuche, einen Dekorateur für Foo zu erstellen und möchte die Methodensignatur korrekt eingeben. Was ist der richtige Weg, um die Funktion foo mit einem Callable einzugeben? Im Moment mache ich: < /p>

Code: Select all

T = TypeVar("T", bound=AbcClass)
V = TypeVar("V")
FooFn = Callable[[T, V], None]
ist jedoch im obigen Code V nicht mit T in Bezug Wert. Wie kann ich das beheben? Die Verwendung der folgenden Verwendung ist nicht möglich, da ABCCASS nicht kovarant ist und ich auch in der Lage sein möchte, eine Unterklasse (z. B.: intclass ) einzugeben.

Code: Select all

FooFn = Callable[[AbcClass[V], V]

Top