decorator对函数递归应用给定的decorator

recursive-decorator的Python项目详细描述


GitHub licensehttps://badge.fury.io/py/recursive-decorator.svghttps://travis-ci.org/yakobu/recursive_decorator.svg?branch=masterhttps://coveralls.io/repos/github/yakobu/recursive_decorator/badge.svg?branch=master

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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Apache Flink外部Jar   创建和强制转换对象数组时发生java错误   Java,添加数组   具有相同包结构和类的java JAR   java Jenkins未能构建Maven项目   java为什么一个forloop比另一个更快,尽管它们做的“一样”?   servlets在将“/”站点迁移到Java EE包时处理contextpath引用   无法解析java MavReplugin:2.21或其某个依赖项   泛型如何编写比较器来泛化Java中的两种类型的对象?   java Android Emulator未在netbeans上加载   多线程Java使用线程对数组中的数字求和:在同步块中使用新变量作为锁:差异   java如何在JSP/servlet中设置<input>标记的值?