【发布时间】:2018-12-29 04:24:04
【问题描述】:
所以,我有一个代码 sn-p 来计算函数调用的次数,在浏览潜在的最佳解决方案时,我遇到了几年前发布的类似问题:
is there a way to track the number of times a function is called?
上面线程中列出的解决方案之一与我的匹配,但存在细微差别。当我发布我的解决方案并询问我的代码中的潜在缺陷时,我的评论被删除了,即使我的评论是该问题的解决方案。所以,我希望这个不会因为重复而关闭,因为坦率地说,我不知道该去哪里。
这是我的解决方案:
def counter(func):
counter.count=0
def wrap(*args,**kwargs):
counter.count += 1
print "Number of times {} has been called so far
{}".format(func.__name__,counter.count)
func(*args,**kwargs)
return wrap
@counter
def temp(name):
print "Calling {}".format(name)
我的计数器被定义为装饰器'counter'的属性,而不是包装函数'wrap'。该代码按当前定义工作。但是,是否存在可能失败的情况?我在这里忽略了什么吗?
【问题讨论】:
-
当然。如果你装饰
foo,调用它几百万次,然后定义一个名为bar的新函数并装饰它,那么你之前的foo计数就会消失。 -
在 Python 装饰器库中有一个更好的 implementations,其中装饰器是一个类,可以使其实例(即它的使用)独立。
-
Martineau 的答案似乎是最好的答案。无论我在哪里定义计数器变量(在 'wrap' 内部或外部),它都不会计算跨多个函数的调用总数。当装饰器应用于新函数时,调用计数会重置。
标签: python python-2.7 python-decorators