假设我们有一些函数 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
那么下面两个大致等价:
<b>class</b> C(A):
...
instance = func(C())
@autofunc
<b>class</b> 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
最佳答案
这只是 mypy
中的一个错误:https://github.com/python/mypy/issues/5865
关于type-hinting - 如何正确键入提示类装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69330379/