Как правильно ввести подсказку для декоратора класса?Python

Программы на Python
Anonymous
Как правильно ввести подсказку для декоратора класса?

Сообщение Anonymous »

Предположим, у нас есть некоторая функция func, которая сопоставляет экземпляры класса A с экземплярами класса B, т.е. она имеет сигнатуру Callable[[A], B] .Я хочу написать декоратор класса autofunc для подклассов A, который автоматически применяет func к экземплярам по мере их создания. Например, представьте себе автоматическую jit-компиляцию на основе глобальной переменной среды. Это можно сделать с помощью
from functools import wraps

def autofunc(basecls):
@wraps(basecls, updated=())

class WrappedClass(basecls):
def __new__(cls, *args, **kwargs):
instance = basecls(*args, **kwargs)
return func(instance)
return WrappedClass

Тогда следующие два примерно эквивалентны:


class
C(A): ...

экземпляр = func(C())


@autofunc
класс
C(A):
...

экземпляр = C()




По своей наивности я попробовал
def autofunc(basecls: type[A]) -> type:

@wraps(basecls, updated=())
class WrappedClass(basecls):

def __new__(cls, *args, **kwargs):
instance = basecls(*args, **kwargs)
return func(instance)

return WrappedClass

что mypy очень не нравится, что вызывает ошибки:
  • error: Variable "basecls" is not valid as a type [valid-type]
  • error: Invalid base class "basecls" [misc]
    также существует проблема, заключающаяся в том, что WrapperClass.__new__ возвращает экземпляр B, а не WrapperClass.

Есть ли в настоящее время способ правильно ввести подсказку для такого декоратора класса, или mypy еще не способен с этим работать?

Пример кода:
from functools import wraps

class A:
pass

class B:
pass

def func(cl: A) -> B:
print(f"Replacing {cl=}")
return B()

def autofunc(basecls: type[A]) -> type:

@wraps(basecls, updated=())
class WrappedClass(basecls):

def __new__(cls, *args, **kwargs):
instance = basecls()
return func(instance)

return WrappedClass


Подробнее здесь: https://stackoverflow.com/questions/693 ... -decorator

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