type-hinting - 如何正确键入提示类装饰器?

标签 type-hinting mypy python-typing python-3.9 python-3.10

假设我们有一些函数 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

那么下面两个大致等价:

<表类="s-表"> <头> <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/

相关文章:

python - 打字。任何与对象?

python - 可以隐式检查 "zeroness"或 "emptiness"的变量类型

python - 如何正确地向 Mixin 类添加类型提示?

python-3.x - Python 类型提示在函数中返回类

python 3.6 : Signature of {method} incompatible with super type {Class}

python - mypy 可以检查文档字符串吗?

python输入: overload vs TypeVar

python - 正在定义的类型对象的类型提示

python - numpy.ndarray 的类型提示/注释 (PEP 484)