python - 没有更好的方法来获得调试函数中的表达式

时间:2011-12-20 09:09:01

标签: python debugging macros abstract-syntax-tree printf-debugging

在c代码中我经常使用printf调试宏,如

#define DPRINT_INT(i) fprintf(stderr,"%s has the value %i at line %i", #i,i, __LINE__)

然后我可以做类似的事情 DPRINT_INT(高度) 它将打印变量或类似的东西 DPRINT_INT(from_cm_to_inch(get_average(高度))) 它将打印出名称的整个表达式。

要为python执行此操作,因为python没有类似c的宏

我传递一个字符串并使用inspect来获取调用函数环境以调用eval。 但我不喜欢传递字符串,它的丑陋和容易忘记(我有它检查类型,如果传递非字符串则调用异常)并且不能与ide一起工作。

没有任何方法可以从python代码中为调试函数提取变量名和表达式?在那里?

1 个答案:

答案 0 :(得分:2)

在Python中,我们倾向于编写我们可以unittest和/或导入REPL的模块,并在必要时将它们驱动到那里。

如果您可以对功能进行单元测试,则可以针对任何给定输入证明其行为。但是,如果必须编写调试语句,则应使用标准debug()模块中的logging

例如:

#!/usr/bin/env python

import logging
import inspect

def buggy_fn():
    d = 42;
    if d != 69:
        logging.debug('%s(%d): %s is not what we expected. [%s]',
                inspect.currentframe().f_back.f_code.co_filename,
                inspect.currentframe().f_back.f_lineno,
                'd',
                repr(d),
                )

if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)
    buggy_fn()

将输出......

DEBUG:root:./buggy.py(19): d is not what we expected. [42]

inspect中有很多有用的东西可以帮助你在需要的时候帮助你。