Well, what python calls a "decorator" is just a function that accepts a function and returns a function with roughly similar functionality. In python, the old way to decorate functions was
def my_decorator(f): ...
def my_function(...): ...
my_function = my_decorator(my_function)
and the new "@my_decorator" syntax is just sugar for this.
Function composition is only one of many things you can do with decorators. You could implement a K-combinator with them if you wanted to:
def kestrel(x):
"decorates a function to evaluate that function, but then return x"
def decorator(f):
def g(*args, **kwargs):
f(*args, **kwargs)
return x
return g
return decorator
@kestrel(4)
def foo(x):
y = x + 1
print y
return y
foo(5) # => 4, but prints 6