def _func(a, *args, **kwargs): print 'Blablabla' return 'a=%s' % str(a) def loggedfunction(f): from functools import wraps @wraps(f) def wrapper(*args, **kwargs): print 'Calling function', f.__name__, 'with args', args, 'and kwargs', kwargs ret = f(*args, **kwargs) print 'Done, returned value is', ret return ret return wrapper func = loggedfunction(_func) def main(): func('a', 'b', foo='bar') if __name__ == '__main__': main() $ python test.py Calling function _func with args ('a', 'b') and kwargs {'foo': 'bar'} Blablabla Done, returned value is a=a