Типизация Python Callable с Concatenate и ParamSpec для функций дочернего класса в декораторе?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Типизация Python Callable с Concatenate и ParamSpec для функций дочернего класса в декораторе?

Сообщение Anonymous »

Я чувствую, что чего-то не понимаю и не знаю, как правильно это написать.
У меня есть родительский класс и дочерний класс. Я пытаюсь создать декоратор с помощью 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")
Теперь, это, конечно, работает отлично (возвращает "привет,\nпривет, мир\n"), но MyPy жалуется на "@decorate", потому что:< /p>

Аргумент 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»