Pylint 在 class 中定义的装饰器上抛出不可调用
Pylint throws not-callable on decorator defined within class
我正在尝试创建一个 class 剩余时间为 属性 并在其中执行功能以减少此时间。这是代码
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
然后当我实例化 class 并像这样使用 do_something
时:
test_class = TestClass()
test_class.do_something("param")
它按预期工作。但是,当我在代码上 运行 pylint 时,出现错误:
pylint: not-callable / f is not callable
这是误报还是有更好的方法来编写此功能?
谢谢
感谢您的评论。将方法移到 class 之外是必需的,因为 self 的绑定取决于方法的调用方式,而不是定义方法的位置,因此装饰器不需要在 class 中定义访问自我:
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
我正在尝试创建一个 class 剩余时间为 属性 并在其中执行功能以减少此时间。这是代码
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
然后当我实例化 class 并像这样使用 do_something
时:
test_class = TestClass()
test_class.do_something("param")
它按预期工作。但是,当我在代码上 运行 pylint 时,出现错误:
pylint: not-callable / f is not callable
这是误报还是有更好的方法来编写此功能?
谢谢
感谢您的评论。将方法移到 class 之外是必需的,因为 self 的绑定取决于方法的调用方式,而不是定义方法的位置,因此装饰器不需要在 class 中定义访问自我:
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