python functools 中的wraps和 partial

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')

你可能感兴趣的:(python functools 中的wraps和 partial)