听起来几乎像是装饰工的教科书示例!
def counted(fn): def wrapper(*args, **kwargs): wrapper.called += 1 return fn(*args, **kwargs) wrapper.called = 0 wrapper.__name__ = fn.__name__ return wrapper@counteddef foo(): return>>> foo()>>> foo.called1
您甚至可以使用另一个装饰器来自动记录一个函数在另一个函数中被调用多少次:
def counting(other): def decorator(fn): def wrapper(*args, **kwargs): other.called = 0 try: return fn(*args, **kwargs) finally: print '%s was called %i times' % (other.__name__, other.called) wrapper.__name__ = fn.__name__ return wrapper return decorator@counting(foo)def bar(): foo() foo()>>> bar()foo was called 2 times
但是,如果最终
foo还是
bar可以自称,那么您将需要一个涉及堆栈的更复杂的解决方案来应对递归。然后,您将走向全面的探查器…
如果您仍在“自学Python”,可能是这种包装好的装饰器材料(通常用于魔术)不是理想的选择!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)