类似copy_properties功能
wrapper包装函数.被更新者,wrapperd被包装函数,数据源 元组WRAPPER_ASSINGMENTS中是要被覆盖的属性
“module”,“name”,“qualname”,“doc”,“annotations” 分别对应模块名,名称,限定名,文档,参数注解
元组WRAPPER_UPDATES中是要被更新的属性,__dict__属性字典
增加一个_wrapped_属性,保留着wrapped函数
偏函数,把函数部分的参数固定下来,相当于为部分函数添加一个固定的默认值,形成一个新的函数返回 从partial生成的函数,是对原函数的封装
import functools def partial(func,*args,**kwargs):##** kwargs = {x:4} def newfunc(*fargs,**fkwargs): ##fkwargs = {x:5} newkwargs = kwargs.copy() ###newkwargs = {x:4} newkwargs.update(fkwargs)## 把x:5更新字典 return func(*(args+fargs),**newkwargs) newfunc.func = func #保留原函数 newfunc.args = args#保留原函数的位置参数 newfunc.kwargs = kwargs return newfunc #此时返回的是fn((*(args+fargs),**newkwargs)即更新后参数的add函数返回结果 def add(x ,y): return x + y foo = partial(add,x=4) foo(x=5,y)@functools.lru_cache(maxsize = 128,typed = False)
Least-recently-used装饰器.lru:最近最少使用的.cache缓存(放在内存中)
cache都是字典的k,v对实现的
如果maxsize设置为None,则禁用LRU功能,并且缓存可以无限制增长.当maxsize是二的幂时,LRU功能执行最好
如果typed设置为Ture,则不同类型的函数参数单独缓存,例如,f(3)和f(3.0)将视为具有不同结果的调用
import functools import time @functools.lru_cache() def add(x,y,z=3): time.sleep(z) return x+y add(4,5) add(4.0,5) add(4,6) add(x=4,y=6)lru_cache装饰器 通过一个字典缓存被装饰器函数的调用和返回值
key是什么/.分析代码看看 functools._make_key方法来生成字典中的key
适用前提 同样的函数参数一定得到同样的结果 (反例,比如随机数) 函数执行时间很长,且要多次执行 本质是函数调用的函数 = >返回值
缺点 不支持缓存过期,key无法过期,失效 不支持清除操作 不支持分布式,是一个单机的缓存 适用场景,单机上需要空间换时间的地方,可以用缓存将计算机变快速
redis可以多台机器用