[Tutor] Decorators

Hugo Arts hugo.yoshi at gmail.com
Wed Jun 30 22:30:02 CEST 2010


On Wed, Jun 30, 2010 at 9:52 PM, Mary Morris <marris1031 at gmail.com> wrote:
> I need help with the following task for my new job:
> The code we're using is python, which I have never worked with before.
> Our AMS source code relies heavily on decorators.Things look something like
> this:
> @decomaker(argA, argB, ...)
> def func(arg1, arg2, ...):
>      pass
> which is the same as
> func = decomaker(argA, argB, ...)(func)
> and
> @dec2
> @dec1
> def func(arg1, arg2, ...):
>      pass
> func = dec2(dec1(func))
> Or when implemented the second example looks like:
> def dec1(func):
>      def new_func(arg1, arg2, ...):
>           ... do something...
>           ret = func(arg1, arg 2, ...)
>           ...  do more things...
>           return ret
>      return new_func
>
> My first task is that there is an issue with the name new_func.  When the
> program crashes, that is what shows up in the logs-which doesn't help debug
> anything.  I need to find out every decorator and make sure it has a
> descriptive name.  I was thinking I could write a simple script which would
> parse through all of the source files and find decorators-maybe by looking
> for the @ symbol?  Then I could manually check to make sure it has a good
> name.  I was thinking I could copy the searching code from find_imports.py
> (up to the startswith() calls) and print the list of decorators found and
> which files that they're in.  I have never worked with python before so I
> definitely need help with this task-any suggestions or examples that would
> be helpful?

The functools library has a function, called wraps, that makes sure
any decorated function maintains its original name and docstring. You
use it inside your decorator functions, like so:

from functools import wraps

def decorator(func):
    @wraps(func)
    def new_func(*args, **kwargs):
        #do some stuff
    return new_func

@decorator
def wrapped_func(a, b):
    """this docstring will be saved, and if the function crashes, it
will  show up as 'wrapped_func' in your tracebacks"""
    # do some other stuff

HTH,
Hugo


More information about the Tutor mailing list