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