假设我们有一些将类实例func
映射到类实例的函数,即它具有签名。A
B
Callable[[A], B]
我想为创建时自动应用于实例autofunc
的子类编写一个类装饰器。例如,考虑基于全局环境变量的自动 jit 编译。这可以通过A
func
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): ... instance = func(C()) |
@autofunc class C(A): ... instance = C() |
---|
在我的天真中,我尝试过
def autofunc(basecls: type[A]) -> type[B]:
@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[B]:
@wraps(basecls, updated=())
class WrappedClass(basecls):
def __new__(cls, *args, **kwargs):
instance = basecls()
return func(instance)
return WrappedClass