You should return the wrapper function itself, not its result:
def tsfunc(func):
def wrappedFunc():
print '%s() called' % func.__name__
return func()
return wrappedFunc # Do not call the function, return a reference instead
Decorators replace the decorated item with the return value of the decorator:
@tsfunc
def foo():
# ....
is equivalent to:
def foo():
# ....
foo = tsfunc(foo)
which expands to (in your code):
foo = wrappedFunc()
so you were replacing the function foo
with the result of the wrappedFunc()
call, not with wrappedFunc
itself.