Decorator error: NoneType object is not callable
decorator, python, python-2.7, python-decorators
Solution
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.
Problem
I wrote a function decorator like this: ``` def tsfunc(func): def wrappedFunc(): print '%s() called' % func.__name__ return func() return wrappedFunc() @tsfunc def foo(): pass foo() # to get it work, use foo instead of foo() foo() ``` I got following error message: ``` foo() called Traceback (most recent call last): File "decorator.py", line 11, in <module> foo() TypeError: 'NoneType' object is not callable ``` I get it work by replacing "foo()" with "foo". but I still didn't get the result I expected: ``` foo() called ``` seems like the `foo` function is only called once. Please help me understand why this is happening.