Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python—没有更好的方法在调试函数中获取表达式吗_Python_Debugging_Macros_Abstract Syntax Tree_Printf Debugging - Fatal编程技术网

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

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

在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获取调用函数环境以调用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]