gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:55:58 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com