[Django]-Get the name of a decorated function?

51πŸ‘

βœ…

You may want to use wraps from functools. See the example

>>> from functools import wraps
>>> def my_decorator(f):
...     @wraps(f)
...     def wrapper(*args, **kwargs):
...         print('Calling decorated function')
...         return f(*args, **kwargs)
...     return wrapper
...
>>> @my_decorator
... def example():
...     """Docstring"""
...     print('Called example function')
...
>>> example()
Calling decorated function
Called example function
>>> example.__name__
'example'
>>> example.__doc__
'Docstring'

100πŸ‘

functools.wraps is not needed! Just use func.__name__

import time

def timeit(func):
    def timed(*args, **kwargs):
        ts = time.time()
        result = func(*args, **kwargs)
        te = time.time()
        print('Function', func.__name__, 'time:', round((te -ts)*1000,1), 'ms')
        print()
        return result
    return timed

@timeit
def math_harder():
    [x**(x%17)^x%17 for x in range(1,5555)]
math_harder()

@timeit
def sleeper_agent():
    time.sleep(1)
sleeper_agent()

Outputs:

Function math_harder time: 8.4 ms
Function sleeper_agent time: 1003.7 ms
πŸ‘€Zach Estela

7πŸ‘

In addition to functools.wraps, you can check out the decorator module which was designed to help with this problem.

πŸ‘€tkerwin

3πŸ‘

3πŸ‘

Check out functools.wraps. Requires python 2.5 or higher though, if that’s an issue.

πŸ‘€meshantz

2πŸ‘

For anyone who needs to access the decorated function name when there are multiple decorators, like this:

@decorator1
@decorator2
@decorator3
def decorated_func(stuff):
    return stuff

the functools.wraps mentioned above solves that.

πŸ‘€Zevgon

Leave a comment