如何在python中为所有print()输出设置前缀?

时间:2019-03-18 05:11:02

标签: python printing formatting

我正在使用python打印到控制台。我正在寻找一段一次性的代码,以便一行代码之后的所有打印语句在开始时都具有4个空格。例如

print('Computer: Hello world')
print.setStart('    ')
print('receiving...')
print('received!')
print.setStart('')
print('World: Hi!')

输出:

Computer: Hello world
    receiving...
    received!
World: Hi!

这将有助于制表功能中包含的所有输出,以及设置制表功能输出时的制表符。这可能吗?

3 个答案:

答案 0 :(得分:2)

您可以定义一个print函数,该函数首先打印您的前缀,然后在内部调用内置的print函数。您甚至可以使自定义print()函数查看调用栈,并据此确定要用作前缀的空间:

import builtins
import traceback

def print(*objs, **kwargs):
    my_prefix = len(traceback.format_stack())*" "
    builtins.print(my_prefix, *objs, **kwargs)

进行测试:

def func_f():
    print("Printing from func_f")
    func_g()

def func_g():
    print ("Printing from func_g")

func_f()

输出:

                    Printing from func_f
                     Printing from func_g

恢复到内置的print()功能:

完成自定义打印后,想要开始使用内置的print()函数,只需使用del来“删除”您自己的打印定义:

del print

答案 1 :(得分:1)

为什么不定义自己的自定义函数,并在需要时使用它:

def tprint(*args):
    print('    ', *args)

它的用法如下:

print('Computer: Hello world')
tprint('receiving...')
tprint('received!')
print('World: Hi!')

输出:

Computer: Hello world
     receiving...
     received!
World: Hi!

答案 2 :(得分:0)

您可能只想在特定位置使用特定前缀

import sys
from contextlib import contextmanager

@contextmanager
def add_prefix(prefix): 
    global is_new_line
    orig_write = sys.stdout.write
    is_new_line = True
    def new_write(*args, **kwargs):
        global is_new_line
        if args[0] == "\n":
            is_new_line = True
        elif is_new_line:
            orig_write("[" + str(prefix) + "]: ")
            is_new_line = False
        orig_write(*args, **kwargs)
    sys.stdout.write = new_write
    yield
    sys.stdout.write = orig_write
    
with add_prefix("Computer 1"):
    print("Do something", "cool")
    print("Do more stuffs")
    
with add_prefix("Computer 2"):
    print("Do further stuffs")
print("Done")

#[Computer 1]: Do something cool
#[Computer 1]: Do more stuffs
#[Computer 2]: Do further stuffs
#Done

优点是它是一个实用程序函数,即您只需导入即可使用它,而不必在每次编写新脚本时都重新定义。