关于python:剥离生产代码

Stripping code for production

所以我想在将代码部署到appengine之前从物理上消除调试代码。我现在做的是一个简单的检查:

1
2
3
4
5
6
settings.py:
DEBUG = os.environ['HTTP_HOST'] == 'localhost'

from settings import DEBUG
if DEBUG:
    #ensure I haven't screwed smth up during refactoring

但是这种检查会在每次调用期间消耗CPU周期,对吗?在爪哇,有一种模式,它会在编译时删除调试代码:

1
2
3
4
5
public static final boolean DEBUG = true; // change to false before going production

if(DEBUG){
 //debug logging
}

有没有一种干净的方法可以在python中实现相同的效果,或者我应该用类似于#%STRIP_ME%的smth来包装要剥离的代码,然后针对它运行自定义脚本?


不,没有干净的路。

python中的条件编译

不同的问题,相似的目标。


首先,我建议您检查"os.environ['server_software'].startswith('dev')"。即使您访问另一台主机上的dev服务器,这也会起作用。

此外,只有在第一次在每个应用服务器实例上导入配置模块时,才会对"debug"语句进行评估。这很好,因为调试状态不会在请求之间改变,而且它还节省了一些CPU周期。不过,如果您稍后处于调试模式,我不会担心CPU周期消耗的检查——挂起的结果要低得多,而且我怀疑您甚至可以测量简单if语句的性能下降。


如果您担心代码并且能够这样做,那么可以使用decorator方法来注入调试,然后对于生产代码,将decorator函数重新定义为no ops。

老实说,我不担心,因为if语句应该与assembly中的跳转语句对应,或者可能不止这两个语句。


您很可能会从使用日志模块和重要性级别中获益。

在发布之前不需要删除代码,如果需要在生产环境中进行调试,您可以对重要性级别进行粒度配置,并且可以很容易地搜索代码以查找通知的来源。