Search code examples
pythonpython-decorators

Decorate a function after it is defined?


I think the answer is no, but I can't seem to find a definitive claim. I have the following situation;

def decorated_function(function):
    @functools.wraps(function)
    def my_function():
        print "Hello %s" % function.__name__
    return my_function

for attr, value in dct.iteritems():
    dct[attr] = decorated_function(value)

And what I really want is something like;

def my_function(function):
    print "Hello %s" % function.__name__

for attr, value in dct.iteritems():
    dct[attr] = functools.wraps(my_function, value)

to remove the confusing shell of decorated_function. Are decorators only possible to apply when the function is defined?


Solution

  • You can decorate functions after they have been defined. In fact, function decorators are only syntactic sugar. For example, you can replace

    @classmethod
    @synchronized(lock)
    def foo(cls):
        pass
    

    with

    def foo(cls):
        pass
    foo = synchronized(lock)(foo)
    foo = classmethod(foo)
    

    See https://www.python.org/dev/peps/pep-0318/ for details.