python - 在调试函数中获取表达式没有更好的方法吗

0 投票
1 回答
554 浏览
提问于 2025-04-17 08:41

在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模块里有很多有用的东西可以帮助你。

撰写回答