У меня есть родительский класс и дочерний класс. Я пытаюсь создать декоратор с помощью ParamSpec, чтобы получить доступ к args/kwargs и возврату внутри декорированной функции дочернего класса, где первый аргумент, конечно, всегда «собственный», и иметь возможность делать что-то, унаследованное от родителя.
Выглядит примерно так:
Код: Выделить всё
from typing import ParamSpec, TypeVar, Concatenate
from collections.abc import Callable
P = ParamSpec("P")
T = TypeVar("T")
class Parent:
def parent_function(self, s:str):
print("hola " + s)
def decorate(
func: Callable[Concatenate[Parent, P], T]
) -> Callable[Concatenate[Parent, P], T]:
def wrapper(self: Parent, *args: P.args, **kwargs: P.kwargs) -> T:
self.parent_function("there")
return func(self, *args, **kwargs)
return wrapper
class Child(Parent):
@decorate
def child_function(self, s:str):
print("hello " + s)
child = Child()
child.child_function("world")
Аргумент 1 для «decorate» имеет несовместимый тип «Callable[[Child, str], Any]»; ожидается "Callable[[Parent, str], Any]"
Я понимаю, что это минимальный пример, но я не уверен, почему он жалуется, что Ребенок здесь не относится к типу Parent. Или есть другой способ обойти это.
MyPy будет совершенно счастлив, если я заменю «Concatenate[Parent,p]» на «P» и просто утверждаю isinstance(args[0],Parent ) внутри оболочки, но я бы предпочел использовать подсказку типа вместо утверждений кода.
Подробнее здесь: https://stackoverflow.com/questions/792 ... ss-functio