记那些踩过的坑:只能用一次的contextlib.contextmanager
记那些踩过的坑:只能用一次的 contextlib.contextmanager
最近想要实现一个需求,优雅地使用不阻塞的 threading.Lock(),何谓优雅,就是基本不改动,继续使用 with。
一开始我的代码是这样子的
1 |
|
测试通过,然而实际使用时却报错: AttributeError: args
翻了翻 contextlib 的源码,发现在 contextlib.py:110,args 属性被删除
1 |
|
当第二次使用该 contextmanager,args 已经是不存在的,所以才会抛出 AttributeError
所以最后的解决方案很显然:
copy 一份 contextmanager 代码,去掉 del 那行代码
手写 contextmanager
记那些踩过的坑:只能用一次的contextlib.contextmanager
https://hunsh.net/archives/3/