有没有一种优雅的方法可以将打印的语句跟踪到打印该语句的代码行?

时间:2019-06-20 08:10:00

标签: python python-3.x

我想要一种快速的方法来识别打印线。 例如,在JS中,有console.trace(),可以轻松指示打印的来源。

我知道我可以打印回溯,但是它对于任务来说太大了,并且使得几乎不可能执行代码执行。 我需要的东西在打印时不会占用太多空间,并且可以将我指向打印输出的正确行。

2 个答案:

答案 0 :(得分:6)

使用logging module,您可以尝试以下操作:

import logging

logging.basicConfig(level=logging.DEBUG, format=("line %(lineno)d: %(message)s"))

def print_line(strg):
    logging.debug(strg)

if __name__ == "__main__":
    print_line("test")

输出

line 18: test

如果这会干扰其余的日志记录,您还可以创建和配置专用的记录器(可能会有更好的方法来实现此目的)

import logging
import sys

print_line_logger = logging.getLogger("print_line")
print_line_logger.setLevel(logging.DEBUG)
formatter = logging.Formatter("line %(lineno)d: %(message)s")
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(formatter)
print_line_logger.addHandler(handler)


def print_line(strg):
    print_line_logger.debug(strg)

答案 1 :(得分:2)

使用@hiroprotagonist所示的日志记录模块可能是可行的方法,但是由于您提到您已经大量使用了日志记录,因此您可能希望使用inspect模块。

此示例将打印执行DEBUG下的print语句的函数;也许这足以满足您的需求?

DEBUG = True

if DEBUG:
    import inspect

    def _print(s):
        print(f'now in: {inspect.stack()[1][3]} -> {s}')


def current_function():
    if DEBUG:
        _print('debug stuff')
    print('doing stuff')


def main():
    current_function()


if __name__ == '__main__':
    main()

输出:

now in: current_function -> debug stuff
doing stuff