0

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

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

然后我可以执行诸如 DPRINT_INT(height) 之类的操作,它将打印变量或诸如 DPRINT_INT(from_cm_to_inch(get_average(heights))) 之类的操作,它将打印出名称的整个表达式。

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

我传递一个字符串并使用检查来获取调用函数环境以调用 eval。但我不喜欢传递字符串,它丑陋且容易忘记(我让它检查类型并在传递非字符串时调用异常)并且在 ide 中效果不佳。

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

4

1 回答 1

2

在 Python 中,我们倾向于编写可以单元测试和/或导入 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可以在你需要的时候帮助你。

于 2011-12-20T09:55:47.183 回答