首页 > 解决方案 > Pylint 在类中定义的装饰器上抛出不可调用

问题描述

我试图创建一个具有剩余时间属性的类并在其中执行函数减少了这个时间。这是代码

class TestClass:
    def __init__(self):
        self.time_remaining = 240

    @staticmethod
    def time_taken(start):
        return (datetime.now() - start).seconds

    def with_timeout(f):
        @wraps(f)
        def wrapper(self, *args, **kwargs):
            start = datetime.now()
            result = f(self, *args, **kwargs)
            self.time_remaining = (
                self.time_remaining - TestClass.time_taken(start)
            )
            return result

        return wrapper

    @with_timeout
    def do_something(self, param):
        # DO Something

然后当我实例化类并do_something像这样使用时:

test_class = TestClass()
test_class.do_something("param")

它按预期工作。但是,当我在代码上运行 pylint 时,出现错误:

pylint: not-callable / f is not callable

这是误报还是有更好的方法来编写此功能?

谢谢

标签: pythonclassdecoratorpylintcallable

解决方案


感谢您的评论。将方法移到类之外是必需的,因为 self 取决于方法的调用方式,而不是定义它的位置,因此不需要在类中定义装饰器即可访问 self:

def time_taken(start):
    return (datetime.now() - start).seconds

def with_timeout(f):
    @wraps(f)
    def wrapper(self, *args, **kwargs):
        start = datetime.now()
        result = f(self, *args, **kwargs)
        self.time_remaining = self.time_remaining - time_taken(start)
        return result

    return wrapper


class TestClass:
    def __init__(self):
        self.time_remaining = 240

    @with_timeout
    def do_something(self, param):
        # DO Something

推荐阅读