<p>如果只想禁用日志记录方法,请使用<code>logging</code>模块。如果日志级别设置为exclude,比如debug语句,那么<code>logging.debug</code>将非常接近no op(它只检查日志级别并返回,而不插入日志字符串)。</p>
<p>如果您想在字节码编译时实际删除特定变量上的代码块,您唯一的选择是相当神秘的<code>__debug__</code>全局变量。除非将<code>-O</code>标志传递给Python(或将<code>PYTHONOPTIMIZE</code>设置为环境中的非空标志),否则此变量设置为<code>True</code>。</p>
<p>如果在<code>if</code>语句中使用<code>__debug__</code>,则<code>if</code>语句实际上只编译成<code>True</code>分支。这种特殊的优化与Python得到的预处理器宏非常接近。</p>
<p>注意,与宏不同,您的代码在<code>if</code>的两个分支中的语法必须仍然正确。</p>
<hr/>
<p>要显示<code>__debug__</code>如何工作,请考虑以下两个函数:</p>
<pre><code>def f():
if __debug__: return 3
else: return 4
def g():
if True: return 3
else: return 4
</code></pre>
<p>现在用<code>dis</code>查看它们:</p>
<pre><code>>>> dis.dis(f)
2 0 LOAD_CONST 1 (3)
3 RETURN_VALUE
>>> dis.dis(g)
2 0 LOAD_GLOBAL 0 (True)
3 JUMP_IF_FALSE 5 (to 11)
6 POP_TOP
7 LOAD_CONST 1 (3)
10 RETURN_VALUE
>> 11 POP_TOP
3 12 LOAD_CONST 2 (4)
15 RETURN_VALUE
16 LOAD_CONST 0 (None)
19 RETURN_VALUE
</code></pre>
<p>如您所见,只有<code>f</code>是“优化的”。</p>