import types
def F1( func) :
def wrapped( *args, **kwargs) :
print "Called with args" , args
print "Called with kwargs" , kwargs
if isinstance ( func, types .FunctionType ) :
# We are the last decorator to execute before the function
print "We executed right before test."
return func( *args)
print "Chainging down to the next decorator"
return func( *args, **kwargs)
return wrapped
@ F1
@ F1
@ F1
def test ( a, b) :
return a + b
print test ( 1 , 2 , check= True )
aW1wb3J0IHR5cGVzCmRlZiBGMShmdW5jKToKCWRlZiB3cmFwcGVkKCphcmdzLCAqKmt3YXJncyk6CgkJcHJpbnQgIkNhbGxlZCB3aXRoIGFyZ3MiLCBhcmdzCgkJcHJpbnQgIkNhbGxlZCB3aXRoIGt3YXJncyIsIGt3YXJncwoJCWlmIGlzaW5zdGFuY2UoZnVuYywgdHlwZXMuRnVuY3Rpb25UeXBlKToKCQkJIyBXZSBhcmUgdGhlIGxhc3QgZGVjb3JhdG9yIHRvIGV4ZWN1dGUgYmVmb3JlIHRoZSBmdW5jdGlvbgoJCQlwcmludCAiV2UgZXhlY3V0ZWQgcmlnaHQgYmVmb3JlIHRlc3QuIgoJCQlyZXR1cm4gZnVuYygqYXJncykKCQlwcmludCAiQ2hhaW5naW5nIGRvd24gdG8gdGhlIG5leHQgZGVjb3JhdG9yIgoJCXJldHVybiBmdW5jKCphcmdzLCAqKmt3YXJncykKCXJldHVybiB3cmFwcGVkCgkJCgpARjEKQEYxCkBGMQpkZWYgdGVzdChhLGIpOgoJcmV0dXJuIGEgKyBiCgkKcHJpbnQgdGVzdCgxLDIsY2hlY2s9VHJ1ZSk=