1

假设我们有一些将类实例func映射到类实例的函数,即它具有签名。ABCallable[[A], B]

我想为创建时自动应用于实例autofunc的子类编写一个类装饰器。例如,考虑基于全局环境变量的自动 jit 编译。这可以通过Afunc

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
4

1 回答 1

1

这只是一个错误mypyhttps ://github.com/python/mypy/issues/5865

于 2021-09-29T08:07:10.263 回答