避免在__debug__上执行代码的选项

时间:2016-03-15 16:52:30

标签: python

代码

让我们定义一个debug函数,用于调试目的:

def debug(x):
    print(x)
    return True

这个功能很快。但是,有时,调用debug时评估的参数处理速度很慢:

def slow_processing(x):
    time.sleep(x)
    return 'Now!'

所以,基本上,在我们的代码中,我们可以看到像这样的行:

[...]
debug(slow_processing(1))
[...]

问题

我希望避免执行debug并在__debug__ == True时评估其参数。这意味着我可以这样做:

if __debug__:
    debug(slow_processing(1))

甚至这个,这有点短:

assert debug(slow_processing(1))

使用-O选项运行Python时,代码将不会执行,也不会评估其参数。

问题

但是,这需要修改源代码中每次调用的代码。我想知道Python中是否有一种方法(有时让我感到惊讶的是它的魔力)以一种未执行的方式声明该函数,并且在__debug__ == True时不评估其参数但不必修改源每次调用debug的代码。

2 个答案:

答案 0 :(得分:3)

如果执行包含调用的代码,则无法阻止对参数的评估。

在这种情况下,最好的办法可能是更改调试调用和函数定义,并将函数作为第一个参数:

def debug(fn, *args, **kw):
    if __debug__:
        print(fn(*args, **kw))
    return True

然后你称之为:

debug(slow_processing, 1)

答案 1 :(得分:1)

我认为这实际上是不可能的。为了减少代码中的变化,我会使用像

这样的单行代码
__debug__ and debug(slow_processing(1))

但邓肯的答案是一个更好的解决方案!