Modifying __defaults__
is a very dubious way to handle this. __defaults__
is for argument default values. If your hooks aren't going to be passed as arguments, you shouldn't store them as an argument default value.
If you really want to be able to modify the hooks later on, you should make your decorator a class that stores the hooks on itself. Here's an example:
class CaptainHook(object):
def __init__(self, func):
self.hooks = []
self.func = func
def __call__(self, *args, **kwargs):
for hook in self.hooks:
hook(*args, **kwargs)
return self.func(*args, **kwargs)
Then:
>>> @CaptainHook
... def sum(a, b):
... return a+b
>>> sum(1, 2)
3
>>> def aHook(*args, **kwargs):
... print "I am a hook!"
>>> sum.hooks.append(aHook)
>>> sum(1, 2)
I am a hook!
3