首页 > 编程语言 > 详细

Python functool

时间:2017-05-12 18:31:42      阅读:565      评论:0      收藏:0      [点我收藏+]

1.functools.partial(func, *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

 

例子

>>> from functools import partial
>>> basetwo = partial(int, base=2)
>>> basetwo.__doc__ = Convert base 2 string to an int.
>>> basetwo(10010)
18

 

2.functools.update_wrapper(wrapper, wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)

将wrapper function更新为wrapped function,多用于decorator,以decorator module中提到的一个例子(用于实现缓存)

def memoize_uw(func):
    func.cache = {}

    def memoize(*args, **kw):
        if kw:  # frozenset is used to ensure hashability
            key = args, frozenset(kw.items())
        else:
            key = args
        if key not in func.cache:
            func.cache[key] = func(*args, **kw)
        return func.cache[key]
    return functools.update_wrapper(memoize, func)

这里memoize就是wrapper function,func就是wrapped function,使用update_wrapper“更新"的内容包括__name__, __doc__, __module__, __dict__,

不更新的情况下以上四项与memoize保持一致。

 

3.@functools.wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)

wraps是update_wrapper的语法糖,从parameter来看就知道少了一个wrapper,于是乎就可以写成

@wraps(func)

def memoize(*args, **kw)

 

Python functool

原文:http://www.cnblogs.com/autoria/p/6846624.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!