【问题标题】:How to set a prefix for all print() output in python?如何为python中的所有print()输出设置前缀?
【发布时间】:2023-04-11 05:44:02
【问题描述】:

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

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

输出:

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

这将有助于对函数中包含的所有输出进行制表符,并设置函数输出何时被制表符。这可能吗?

【问题讨论】:

    标签: python printing formatting


    【解决方案1】:

    您可以定义一个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
    

    【讨论】:

      【解决方案2】:

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

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

      它会这样使用:

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

      输出:

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

      【讨论】:

        【解决方案3】:

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

        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
        

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

        【讨论】:

          猜你喜欢
          • 2014-10-06
          • 2020-07-28
          • 1970-01-01
          • 2017-08-26
          • 2022-01-09
          • 2010-10-05
          • 2019-10-05
          • 1970-01-01
          • 2022-11-27
          相关资源
          最近更新 更多