2017-06-15 141 views
1

在一个相对较大的python3代码库中,有几个打印语句通过我想要查找的代码点开。如果打印功能可以被覆盖,它会使打印文件和行号总是非常容易。示例输出:全局覆盖打印语句python

>>> print("Some Message") 
filename:line_number 
Some Message 

对我来说,这是特别的问题,因为Python文件被包裹起来的二进制块内,并grepping对他们来说是徒劳无益的,而是由回溯模块给出的文件名是仍明智的。

对于python2的解决方案,有这个提问/回答: How to make print() override work "globally"

+0

请注意,这是一个非常好的理由,为什么你不应该使用'print'进行日志记录,而是实际的'logging'模块。这将允许您定义处理程序和格式化程序,以完成您所需的操作。 –

+0

我完全同意,并在我自己的代码中做到这一点 – sdfgeoff

回答

1

咨询这并没有完全回答我的问题其他各种计算器的问题后,下面的代码出现了:

import traceback 

def dprint(*args): 
    '''Pre-pends the filename and linenumber to the print 
    statement''' 
    stack = traceback.extract_stack()[:-1] 
    last = stack[-1] 

    # Handle different versions of the traceback module 
    if hasattr(last, 'filename'): 
     out_str = "{}:{}\n".format(last.filename, last.lineno) 
    else: 
     out_str = "{}:{}\n".format(last[0], last[1]) 

    # Prepend the filename and linenumber 
    __builtins__['oldprint'](out_str, *args) 


if 'oldprint' not in __builtins__: 
    __builtins__['oldprint'] = __builtins__['print'] 
__builtins__['print'] = dprint 

它应该处理打印的所有用途,因为它只是预先支持一个参数。