带着问题学习动力是较强的, 直接上例子
引子
代码如下:
1 | # coding:utf-8 |
众所周知, 结果肯定为:
1 | 36 |
因为这个闭包引用了外部的k, v嘛, 那是存在哪里呢?
debug一波, 此时发现func_closure是这样存的
把 make_actions
改成1
2
3
4
5
6def make_actions():
acts = []
xxd = {1: '1', 2: '2', 3: '3'}
for k, v in xxd.iteritems():
acts.append(lambda x, key=k, val=v, : (key + int(val)) ** x)
return acts
再debug断点查看一波就完事了, 会发现现在 func_defaults
里现在有东西了
基于函数替换型reload中的应用
实现python热更逻辑的时候要记得处理func_closure
如类似下方的这段代码要怎么reload呢?
1 |
|
debug断点查看一波, 发现func_closure里还有 function object
那reload需要对含有闭包的情况进行一些简单处理:
python如果被更新的函数带 closure,新旧函数的 func_closure 个数不同的话,旧函数会被新函数直接替换。closure 内的函数对象也会跟着热更新,也就是说支持热更新被装饰器装饰的函数,默认值更新 2 层,有需要更多的层的项目可以改变 update_cell_depth 的值
1 | def update_fun( old_fun, new_fun, update_cell_depth = 2 ): |