在上下文中更改python的打印行为

时间:2013-12-31 11:49:18

标签: python

我希望(仅用于调试目的)能够更改打印在上下文中的工作方式

def printing_foo(a):
    print(a)
    return a

print("{")
with print_prefix(" " * 4):
    list(map(printing_foo, range(4)))
print("}")

会产生:

{
    0
    1
    2
    3
}

很像你可以有一个小数的本地上下文。

或者我是否必须编写自己的上下文敏感打印并导入并在所有模块中使用它?

2 个答案:

答案 0 :(得分:3)

您可以使用上下文管理器捕获sys.stdout,然后对其进行前缀print()前缀:

from contextlib import contextmanager
import sys

class Prefixer(object):
    def __init__(self, prefix, orig):
        self.prefix = prefix
        self.orig = orig
    def write(self, text):
        self.orig.write(self.prefix + text)
    def __getattr__(self, attr):
        return getattr(self.orig, attr)     

@contextmanager
def prefix_stdout(prefix):
    current_out = sys.stdout
    try:
        sys.stdout = Prefixer(prefix, current_out)
        yield
    finally:
        sys.stdout = current_out

并用作:

with prefix_stdout('Prefixed: '):
    print('Hello world!')

但请注意print()次调用通常会在不同的块中将数据写入stdout;最后的换行符是单独的写。

答案 1 :(得分:0)

对于调试,我建议使用日志记录模块。