decorator对函数递归应用给定的decorator
recursive-decorator的Python项目详细描述
decorator递归地对函数/方法内部的所有函数应用给定的decorator。
什么是recursive_decorator?
recursive_decorator是一个decorator,它允许我们在运行时decorate/trasform沿堆栈调用的所有函数,其动机是需要向已知的未知函数以及沿堆栈调用添加/转换逻辑。
注:
- 函数/方法不会被替换,将返回新实例。
- 不能用同一个transformer/decorator多次包装函数/方法。
安装
$ pip install recursive_decorator
用法
导入递归装饰符
fromrecursive_decoratorimportrecursive_decorator
定义您的decorator以递归方式应用于所有函数。
>>>defdecorator(f):...:defwrapper(*args,**kwargs):...:print(f.__name__)...:returnf(*args,**kwargs)...:returnwrapper
现在在函数中使用decorator而不使用递归decorator将导致以下输出
>>>@decorator...:defmain_function():...:sub_function()>>>main_function()main_function
使用递归装饰符将导致
>>>@recursive_decorator(decorator)...:defmain_function():...:sub_function()>>>main_function()main_functionsub_function
此外,如果sub_函数有函数调用,它们将修饰为
>>>defsub_function():...:another_function()>>>@recursive_decorator(decorator)...:defmain_function():...:sub_function()>>>main_function()main_functionsub_functionanother_function
等等…
示例
执行时停止
我们可以用try包装所有函数,除了…
>>>importsys>>>importipdb>>>fromrecursive_decoratorimportrecursive_decorator>>>defwrap_function_with_try_except(f):...:deftransformed_func(*args,**kwargs):...:try:...:returnf(*args,**kwargs)...:except:...:ipdb.set_trace(sys._getframe().f_back)...:returntransformed_func>>>defthrows_exception():...:raiseException>>>@recursive_decorator(wrap_function_with_try_except)...:deffunction():...:throws_exception()...:pass>>>function()21throws_exception()--->22pass23
如果函数将引发错误…IPDB会话将启动。
剖面仪
我们可以为所有正在运行的函数设置时间分析器。
>>>importtime>>>fromrecursive_decoratorimportrecursive_decorator>>>defduration_transformer(f):...:deftransformed_func(*args,**kwargs):...:start_time=time.time()...:value=f(*args,**kwargs)...:end_time=time.time()...:print("function {} duration is {} minutes"...:.format(f.__name__,end_time-start_time))...:returnvalue...:returntransformed_func>>>defwaiting_function():...:time.sleep(5)>>>@recursive_decorator(duration_transformer)...:deffunction():...:waiting_function()>>>function()functionwaiting_functiondurationis5.00511908531189minutesfunctionfunctiondurationis5.006134510040283minutes