python—没有更好的方法在调试函数中获取表达式吗
在c代码中,我经常使用printf调试宏,比如python—没有更好的方法在调试函数中获取表达式吗,python,debugging,macros,abstract-syntax-tree,printf-debugging,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(从厘米到英寸(获得平均高度) 它将打印出名称的整个表达式 要为python实现这一点,因为python没有类似c的宏 我传递一个字符串并使用inspect获取调用函数环境以调用ev
#define DPRINT_INT(i) fprintf(stderr,"%s has the value %i at line %i", #i,i, __LINE__)
然后我可以做像这样的事情
DPRINT_INT(高度)
它将打印变量或类似的内容
DPRINT(从厘米到英寸(获得平均高度)
它将打印出名称的整个表达式
要为python实现这一点,因为python没有类似c的宏
我传递一个字符串并使用inspect获取调用函数环境以调用eval。
但我不喜欢传递字符串,它很难看而且很容易忘记(我让它检查类型,如果传递的是非字符串,则调用一个异常),并且在ide中不起作用
没有任何方法可以从调试函数的python代码中提取变量名和表达式?有吗?在Python中,我们倾向于编写可以和/或导入REPL的模块,并在必要时将它们驱动到REPL中 如果您可以对函数进行单元测试,就可以证明它们在任何给定输入下的行为。但是,如果必须编写调试语句,则应使用标准模块中的 例如: 将输出。。。
有很多有用的东西可以在您需要的时候帮助您。在Python中,我们倾向于编写我们可以和/或
导入到REPL中的模块,并在必要时将它们驱动到那里。在五年的Python编程中,我从未使用过调试器,我不是在谈论调试器,尽管ipython-pdb很不错(ipython中的调试器在异常情况下)。我说的是printf调试,即在程序中的点上撒上debug\u print函数,将其视为日志记录的一种快速而肮脏的替代方法。你考虑过了吗?同意Johnsyweb的观点:只需输入一些日志记录.debug
语句。模块的导入和配置只需要两行代码,而且它可以让您在以后轻松禁用日志级别,而无需更改代码。有没有办法让它捕获变量名/表达式并打印出来?既然这是我要讨论的一个主要部分,那么除了string/eval之外,还有什么方法可以捕获d/变量名/表达式名呢?(这样你就不必重复了?)。也许我应该实现一个Eval Log类,该类对记录器进行子类化或包含/转发给记录器?大多数事情在Python中都是可以实现的。不过,它们并不总是一个好主意。注意。
#!/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]