python - 在调试函数中获取表达式没有更好的方法吗
在C语言代码中,我经常使用一些调试宏,比如
#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中,由于没有像C语言那样的宏,
我就传递一个字符串,并使用inspect模块来获取调用函数的环境,然后用eval来执行它。
不过我不喜欢传字符串,这样看起来很丑,而且容易忘记(我会检查类型,如果传入的不是字符串就抛出异常),而且在IDE中也不太好用。
在Python代码中,难道没有办法提取变量名和表达式,以便用于调试函数吗?
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
模块里有很多有用的东西可以帮助你。