Как правильно ввести подсказку для декоратора класса?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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как ввести подсказку декоратора, чтобы указать тип возврата декорированной функции, сохраняя при этом видимость доктора
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Когда использовать фабрику декоратора и декоратора?
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Когда использовать фабрику декоратора и декоратора?
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Можно ли правильно ввести подсказку для функции filterM в Python?
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Как правильно ввести подсказку `flax.linen.module.apply
    Anonymous » » в форуме Python
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous

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