def default(fun, **kwdefault):
@functools.wraps(fun)<EOL>def wrapped(*args, **kwargs):<EOL><INDENT>merge = wrapped.default.copy()<EOL>merge.update(kwargs)<EOL>return fun(*args, **merge)<EOL><DEDENT>wrapped.default = kwdefault<EOL>return wrapped<EOL>
change default value for function
ex)
def sample(a, b=1, c=1):
    print 'from sample:', a, b, c
    return a, b, c
fun = default(sample, b=4,c=5)
print fun.default  # get default value dictionary
fun(1)  # print 1, 5, 5 and return

:param fun:
:param kwdefault:
:return: