• Python functool module


    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。最简单情况下调用memoize_uw应该返回一个memoize的实例,然后调用memoize返回func,这样我们得到的是memoize的实例。但是,我们希望得到的是被包装函数,也就是func的实例,实际上memoize和func的差别很小,我们可以通过一个函数实现。函数wrapper function中默认参数assigned“指派”的内容包括__module__, __name__, __qualname__, __annotations__, __doc__,使用默认参数update“更新”的是__dict__,指派的意思是覆盖,更新的意思是添加了func.attrF,也就是说memoize方法内声明的属性(memoize.attrM)会被保留,但是访问方法会更名为func.attrM。

    在以下的示例中,使用update_wrapper和直接返回memoize的区别就是访问f1.__doc__得到的是"Simulate some long computation"还是None

    @memoize_uw
    def f1(x):
        "Simulate some long computation"
        time.sleep(1)
        return x

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

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

    def memoize_uw(func):
        func.cache = {}
        @wraps(func)
        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 memoize
  • 相关阅读:
    高斯消元
    Luogu P2068 统计和
    Luogu P1892 [BOI2003]团伙
    Luogu P2866 [USACO06NOV]糟糕的一天Bad Hair Day
    Luogu P3916 图的遍历
    Luogu P1041 [2003NOIP提高组]传染病控制
    Luogu P3901 数列找不同
    Luogu 2951 捉迷藏Hide and Seek
    Luogu P1550 打井Watering Hole
    洛谷——P1044 栈
  • 原文地址:https://www.cnblogs.com/autoria/p/6846624.html
Copyright © 2020-2023  润新知