Skip to main content
GitHub license https://badge.fury.io/py/recursive-decorator.svg https://travis-ci.org/yakobu/recursive_decorator.svg?branch=master https://coveralls.io/repos/github/yakobu/recursive_decorator/badge.svg?branch=master

Decorator to apply a given decorator recursively on all function, inside a function/method, recursively.

What is recursive_decorator?

recursive_decorator is a decorator that allows us to decorate/trasform all functions along the stack call at runtime, motivated by the need to add/transform logics, to knownunknown functions, along the stack calls.

Notes:

  • Functions/Methods will not be replaced, new instances will be returned.

  • Function/Methods cannot be wrapped more then once with same transformer/decorator.

Installing

$ pip install recursive_decorator

Usage

import recursive_decorator

from recursive_decorator import recursive_decorator

define your decorator to apply recursively on all functions.

>>> def decorator(f):
...:    def wrapper(*args, **kwargs):
...:        print(f.__name__)
...:        return f(*args, **kwargs)
...:    return wrapper

Now using your decorator on function without using recursive_decorator will leads to the following output

>>> @decorator
...:def main_function():
...:   sub_function()

>>> main_function()
main_function

Using recursive_decorator leads to

>>> @recursive_decorator(decorator)
...:def main_function():
...:   sub_function()

>>> main_function()
main_function
sub_function

Furthermore, if sub_function has function calls, they will decorated to

>>> def sub_function():
...:    another_function()

>>> @recursive_decorator(decorator)
...:def main_function():
...:   sub_function()

>>> main_function()
main_function
sub_function
another_function

and so on…

Examples

Stop on Execption

We can wrap all functions with try except…

  >>> import sys
  >>> import ipdb
  >>> from recursive_decorator import recursive_decorator

  >>> def wrap_function_with_try_except(f):
  ...:    def transformed_func(*args, **kwargs):
  ...:        try:
  ...:            return f(*args, **kwargs)
  ...:        except:
  ...:            ipdb.set_trace(sys._getframe().f_back)
  ...:    return transformed_func

  >>> def throws_exception():
  ...:    raise Exception


  >>> @recursive_decorator(wrap_function_with_try_except)
  ...:def function():
  ...:    throws_exception()
  ...:    pass

  >>> function()
     21     throws_exception()
---> 22     pass
     23

If function will throw an error… ipdb session will start.

Profiler

We can set time profiler for all running functions.

>>> import time

>>> from recursive_decorator import recursive_decorator


>>> def duration_transformer(f):
...:    def transformed_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))
...:        return value
...:    return transformed_func


>>> def waiting_function():
...:    time.sleep(5)


>>> @recursive_decorator(duration_transformer)
...:def function():
...:    waiting_function()

>>> function()
function waiting_function duration is 5.00511908531189 minutes
function function duration is 5.006134510040283 minutes

Metadata

Release files for recursive-decorator 1.0.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for recursive-decorator 1.0.7
File Size Uploaded
recursive_decorator-1.0.7.tar.gz 5.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for recursive-decorator 1.0.7
File Interpreter ABI Platform
recursive_decorator-1.0.7-py3-none-any.whl Python 3 none any Details

Total release size: 12.8 kB

Release files / recursive_decorator-1.0.7.tar.gz

Download URL recursive_decorator-1.0.7.tar.gz
Size 5.9 kB
Tags Source
SHA-256 checksum
How to use checksums
41d88e3424c6ea14eee4dc56799193aa2ea4602bfb2f35edb93f524e73c61c91
BLAKE2b-256 checksum
How to use checksums
ef8b065d1e80ed4f3d4eb2d13a443b7f484f28ea09dfe1a19b8318cf71a02e78
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/40.2.0 requests-toolbelt/0.8.0 tqdm/4.25.0 CPython/3.4.6

Release files / recursive_decorator-1.0.7-py3-none-any.whl

Download URL recursive_decorator-1.0.7-py3-none-any.whl
Size 6.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5a6b840a67f01bd295e62e3995647de6a6d89fdb407a93d751c2537d887eefdf
BLAKE2b-256 checksum
How to use checksums
370c6580dbfb6a01d8e0e752d5994ed26780359f5d97ad15443888b424994418
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/40.2.0 requests-toolbelt/0.8.0 tqdm/4.25.0 CPython/3.4.6

Release history Release notifications | RSS feed

This release

1.0.7 This release

2 release files

1.0.6

2 release files

1.0.5

2 release files

1.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page