python - is there no better way to get the expression in a debug function

拜拜、爱过 提交于 2019-12-11 16:08:42

问题


in c code I frequently use printf debugging macros like

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

and then i can do things like DPRINT_INT(height) where it will print the variable or things like DPRINT_INT(from_cm_to_inch(get_average(heights))) and it will print out the whole expression for the name.

To do this for python, since python doesn't have c-like macros

I pass a string and use inspect to get the calling functions environment to call eval with. But I don't like passing strings, its ugly and easy to forget(I have it check type and call an exception if it gets passed a non string) and doesn't work as well with the ide.

There isn't any way to extract the variable names and expressions from the python code for the debug function? is there?


回答1:


In Python we tend to write modules that we can unittest and / or import into the REPL and drive them there if necessary.

If you can unit-test your functions, you can prove their behaviour for any given input. However, if you must write debug statements, you should use debug() from the standard logging module.

For example:

#!/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()

Will output...

DEBUG:root:./buggy.py(19): d is not what we expected. [42]

There's a wealth of useful stuff in inspect that may help you out in your hour of need.



来源:https://stackoverflow.com/questions/8573023/python-is-there-no-better-way-to-get-the-expression-in-a-debug-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!