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.