Back to home

被忽略的真相——python的编译优化

最近处理一个反馈,修改一个低概率出现的bug的过程中,使用了python中的assert,来达到判断入口条件是否满足,否则抛出异常的目的。对这个一行代码解决一个bug的简洁修复颇为满意,请小伙伴们走读并自测之后把升级包打了出去。不料经过一周,问题又幽灵般地出现了!

百思不得其解,只好多打日志,想尽办法努力在自己的环境重现问题(此处略去1w字)。当终于抓到这个魔鬼的一刹那,简直都不敢相信自己的眼睛:明明不满足条件的逻辑,竟然顺利执行没有抛出异常。

assert失效了?在C语言中,这不是问题,因为assert仅仅在debug版本有效,优化过的release版本并不会执行assert语句。可是我用的是python啊,从未听说过python还有release版和debug版的区别。

外事不决问谷歌。
if __debug__:
if not expression: raise AssertionError
"assert" statements are removed when the compilation is optimized.
If you use assert to implement application functionality, then optimize the deployment to production, you will be plagued by "but-it-works-in-dev" defects.

当环境变量PYTHONOPTIMIZE被设置时,__debug__就成为False了 ,assert语句自然而然就失效了