【发布时间】:2014-01-04 16:47:03
【问题描述】:
我想编写一个装饰器来限制对包装函数的调用次数。比如说,如果我希望包装函数最多被调用 10 次,那么装饰器应该在前 10 次执行该函数,然后它应该返回 None。
这是我想出的:
from functools import wraps
def max_calls(num):
"""Decorator which allows its wrapped function to be called `num` times"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
calls = getattr(wrapper, 'calls', 0)
calls += 1
if calls == num:
return None
setattr(wrapper, 'calls', calls)
return func(*args, **kwargs)
setattr(wrapper, 'calls', 0)
return wrapper
return decorator
然而,这个计数正确调用,当达到限制时返回None,但是......它不会在程序运行之间重置。也就是说,如果我执行一次程序,计数器达到5,然后重新执行程序,它从5继续。我需要更改什么才能使装饰器正常工作?
【问题讨论】:
-
在我的机器上,当我第二次运行脚本时,计数器会按预期重置。你是如何执行你的脚本的?我猜你没有从命令行执行
python myscript.py。 -
That is, if I execute the program once, the counter reaches 5, and then re-execute the program, it continues from 5.. 你能解释一下你是如何执行程序的吗? -
你在 python 解释器中运行吗?
-
我有一个 Flask 应用程序,在视图中我开始执行一个用上述装饰器装饰的函数。在这个函数内部,还有对同一函数的其他调用;我想实现的想法是只说,10次,要调用的包装函数,然后返回
None。