1.wraps
functools.wraps(wrapped[, assigned][, updated])
当定义一个wrapper函数时,这是一个非常方便的函数,用来调用 update_wrapper() 作为一个函数装饰器。它相当于 partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated)。举例:
from functools import wraps, partial
def my_decorator(f):
@wraps(f)
def wrapper(*args, **kwds):
print 'Calling decorated function'
return f(*args, **kwds)
return wrapper
@my_decorator
def example():
"""Docstring"""
print 'Called example function'
if __name__ == '__main__':
# process result:
# Calling decorated function
# Called example function
example()
# add wraps decorator reuslt is :example Docstring __main__
# print example.__name__, example.__doc__, example.__module__
# not add wraps decorator reuslt is :wrapper None __main__
print example.__name__, example.__doc__, example.__module__
2.partial
functools.partial(func[,*args][, **keywords])
返回一个新的 partial 类当他被调用时,就像 func(args,*keywords)被调用了.如果提供了更多的参数,都将追加在args中,如果额外的关键字参数被提供,将加入到keywords中。大致如下:
def partial(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*(args + fargs), **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc
partial() 被用在partial函数应用中,被冻结了部分函数参数,导致一个新的签名对象,比如 partial() 可以被用在创建一个可调用的行为像 int() 函数,其中base参数默认是2:
basetwo = partial(int, base=2)
basetwo.__doc__ = 'Convert base 2 string to an int.'
print basetwo('10010')