Python用类来写带参数的装饰器,碰到一个错误提示,不知是否Pycharm的BUG,但代码可正常运行


看到这个错误提示,我不知道是不是Pycharm的问题,还是我代码的问题,
但是 上图 这个代码,是可以正常执行,结果也是预期的正确,我把代码贴出来,大伙一起分析分析

import time

class GetExecTime:
    def __init__(self, sec):
        self.sec = sec

    def __call__(self, func):
        self.func = func
        return self.wrapper

    def wrapper(self, *args, **kwargs):
        for i in range(self.sec):
            print(f"距离函数执行还有{self.sec - i}秒钟")
            time.sleep(1)
        t1 = time.time()
        result = self.func(*args, **kwargs)
        t2 = time.time()
        print(f"函数执行时间是:{t2 - t1}秒")

        return result


@GetExecTime(2)
def myfunc(n):
    k = 0
    for i in range(n):
        k = i
    return k


if __name__ == '__main__':
    r = myfunc(66)
讨论数量: 1
Jason990420

第一个写法, PyCharm 只知道 self.__call__ 返回一个类的属性 self.wrapper, 以其属性来调用参数66, PyCharm 无法判断参数, 所以给了警告, 并不代表错误.

第二种写法, self.__call__ 返回的是一个函数 wrapper, PyCharm 可以判断参数, 所以没有警告.

避免的方法, 就是透过型别注释(Type Annotation) - 类型提示支持

import time
from typing import Callable, TypeVar

RT = TypeVar('RT')  # return type


class GetExecTime:

    def __init__(self, sec):
        self.sec = sec

    def __call__(self, func) -> Callable[..., RT]:      # Type Annotation
        self.func = func
        return self.wrapper

    def wrapper(self, *args, **kwargs):
        for i in range(self.sec):
            print(f"距离函数执行还有{self.sec - i}秒钟")
            time.sleep(1)
        t1 = time.time()
        result = self.func(*args, **kwargs)
        t2 = time.time()
        print(f"函数执行时间是:{t2 - t1}秒")
        return result


@GetExecTime(2)
def myfunc(n):
    k = 0
    for i in range(n):
        k = i
    return k


if __name__ == '__main__':
    r = myfunc(66)

Refer stackoverflow.com/questions/470601...

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!