今天在看flask源码时看到了这样的写法:
request = LocalProxy(partial(_lookup_req_object, 'request'))
第一次见partial的使用,所以查了查资料学习了下。
我们可以简单的理解为 partial(func, ‘request’) 就是使用 ‘request’ 作为func的第一个默认参数来产生另外一个function。
所以, partial(_lookup_req_object, ‘request’) 我们可以理解为:
生成一个callable的function,这个function主要是从 _request_ctx_stack 这个LocalStack对象获取堆栈顶部的第一个RequestContext对象,然后返回这个对象的request属性。
functools.partial 通过包装手法,允许我们 “重新定义” 函数签名
用一些默认参数包装一个可调用对象,返回结果是可调用对象,并且可以像原始对象一样对待
冻结部分函数位置函数或关键字参数,简化函数,更少更灵活的函数参数调用
1 | #args/keywords 调用partial时参数 |
声明:
urlunquote = functools.partial(urlunquote, encoding='latin1')
当调用 urlunquote(args, *kargs)
相当于 urlunquote(args, *kargs, encoding='latin1')
应用:
典型的,函数在执行时,要带上所有必要的参数进行调用。
然后,有时参数可以在函数被调用之前提前获知。
这种情况下,一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用。