如何创建冷却装饰器
How to create a cooldown decorator
我正在尝试在Python中创建一个冷却装饰器3。理想的用法如下:
@cooldown(duration=2)
def func(string):
print(string)
然后...
func('1st attempt') # should work (as cooldown == 0) and reset cooldown (cooldown = 2)
func('2nd attempt') # should fail (as cooldown != 0)
func.update_cooldown() # should decrease cooldown (cooldown -= 1)
func('3rd attempt') # should also fail (as cooldown != 0)
func.update_cooldown() # should decrease cooldown (cooldown -= 1)
func('4th attempt') # should work (as cooldown == 0) and reset cooldown (cooldown = 2)
我的代码(Python 3.8):
import functools
def cooldown(duration):
def decorator(method):
cooldown = 0
@functools.wraps(method)
def wrapper(*args, **kwargs):
nonlocal cooldown
if cooldown <= 0:
cooldown = duration
return method(*args, **kwargs)
print(f'Cooldown active, {cooldown} updates remaining')
return wrapper
return decorator
我如何添加减少特定装饰功能的冷却时间计数器的功能?我将如何调整它以使用 class 方法?
提前致谢!
def cooldown(duration):
def decorator(method):
cooldown = 0
@functools.wraps(method)
def wrapper(*args, **kwargs):
nonlocal cooldown
if cooldown <= 0:
cooldown = duration
return method(*args, **kwargs)
print(f"Cooldown active, {cooldown} updates remaining")
def update_cooldown():
nonlocal cooldown
cooldown -= 1
wrapper.update_cooldown = update_cooldown
return wrapper
return decorator
cooldown
每个装饰函数的变量都是唯一的,因为在每次冷却调用中你定义了新的装饰函数 def decorator(method):
,以及新的冷却计数器。
它已经适用于类方法:
class A:
@classmethod
@cooldown(duration=2)
def a(cls):
print("whatever")
A.a() # whatever
A.a() # Cooldown active, 2 updates remaining
A.a.update_cooldown()
A.a() # Cooldown active, 1 updates remaining
我正在尝试在Python中创建一个冷却装饰器3。理想的用法如下:
@cooldown(duration=2)
def func(string):
print(string)
然后...
func('1st attempt') # should work (as cooldown == 0) and reset cooldown (cooldown = 2)
func('2nd attempt') # should fail (as cooldown != 0)
func.update_cooldown() # should decrease cooldown (cooldown -= 1)
func('3rd attempt') # should also fail (as cooldown != 0)
func.update_cooldown() # should decrease cooldown (cooldown -= 1)
func('4th attempt') # should work (as cooldown == 0) and reset cooldown (cooldown = 2)
我的代码(Python 3.8):
import functools
def cooldown(duration):
def decorator(method):
cooldown = 0
@functools.wraps(method)
def wrapper(*args, **kwargs):
nonlocal cooldown
if cooldown <= 0:
cooldown = duration
return method(*args, **kwargs)
print(f'Cooldown active, {cooldown} updates remaining')
return wrapper
return decorator
我如何添加减少特定装饰功能的冷却时间计数器的功能?我将如何调整它以使用 class 方法?
提前致谢!
def cooldown(duration):
def decorator(method):
cooldown = 0
@functools.wraps(method)
def wrapper(*args, **kwargs):
nonlocal cooldown
if cooldown <= 0:
cooldown = duration
return method(*args, **kwargs)
print(f"Cooldown active, {cooldown} updates remaining")
def update_cooldown():
nonlocal cooldown
cooldown -= 1
wrapper.update_cooldown = update_cooldown
return wrapper
return decorator
cooldown
每个装饰函数的变量都是唯一的,因为在每次冷却调用中你定义了新的装饰函数 def decorator(method):
,以及新的冷却计数器。
它已经适用于类方法:
class A:
@classmethod
@cooldown(duration=2)
def a(cls):
print("whatever")
A.a() # whatever
A.a() # Cooldown active, 2 updates remaining
A.a.update_cooldown()
A.a() # Cooldown active, 1 updates remaining