你用过 python 的标准库 functools 的 partial 函数吗?
你用过 python 的一个关键字 nonlocal 吗?
那么他们两者结合能做到什么功能?
从一个简单需求开始:
但是每次调用都需要设置 sep 参数,很麻烦。
上一节我们使用字典存放函数参数值,简化了重复设置参数的困扰:
但是,这方式写起来不直观,到处是奇奇怪怪的符号。
有没有一种方式让我们就像调用普通函数一样,却能做到同样效果的方式?
今天我们就来学习标准库中的函数,并且提供他的改良版和应用场景。
重复设置大量参数的场景其实很常见,为此 python 在标准库中提供了解决方式。
现在我们可以不断使用他:
这家伙完全做到了上一节的效果,并且使用上非常直观舒服。
目前为止,这些内容你都可以在网络上搜索到,没有啥特别。
但是,大概了解其运行机制,有助于我们写出标准库不能直接提供的功能。
接下来,就是原理和改进环节
初学者往往把 partial 的实现的功能看作是黑魔法,但是其实他运用的只是我们上一节说过的原理。
以下是我们自己实现的 partial 简化版:
使用与之前的一样:
如果你看过我以前关于装饰器的文章,你大概马上理解:
如下是整个调用过程:
知道这些有啥用?现在就来看一个场景:
想想看,只是靠 functools.partial 是做不到这效果
这个需求的难点在于,怎么能在每次 myprint 调用后,保存层级状态。
再看看之前的流程图:
显然,能保存东西的变量可以定义在 红色区 里面,绿色区之前:
但是,我们是无法直接在 _real_func 里面修改这个变量。这是 python 避免我们误操作的限制。
他也给了相应解除限制的关键字—— nonlocal:
有了这个机制,剩下只是一些细节实现而已:
如果你学过类、对象这些面向对象的知识,你就会发现,上面相当于给最外层的函数(函数==对象)加了一个属性而已 因此,如果使用类来实现此需求会更加符合直觉
你学会了没有?
记得点赞,转发!谢谢支持!
推荐阅读: