您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

(python)在函数中使用装饰器进行彩色打印

(python)在函数中使用装饰器进行彩色打印

一个有趣的问题。最简单的解决方案将类似于Pete的建议。只需在运行功能到stderr和stdout之前打印转义码。但是,如果stderr和stdout都馈入同一端子(通常是这样),则它们将相互干扰。

因此,另一种解决方案是用微型包装器在stdout和stderr上进行猴子补丁,从而在每次写入期间启用颜色,只有当我们在终端(而不是通过管道)时,才应注意这样做。

#!/usr/bin/python2

import sys

def colorize(stdoutColor, stderrColor):
  defaultColor = '\033[0;0m'

  def applyColorize(f):
    class colorWrapper(object):
      def __init__(self, wrapee, color):
        self.wrapee = wrapee
        self.color = color
      def __getattr__(self, attr):
        if attr == 'write' and self.wrapee.isatty():
          return lambda x: self.wrapee.write(self.color + x + defaultColor)
        else:
          return getattr(self.wrapee, attr)

    def wrapper(*args, **kwds):
      oldStdout = sys.stdout
      oldStderr = sys.stderr
      sys.stdout = colorWrapper(oldStdout, stdoutColor)
      sys.stderr = colorWrapper(oldStderr, stderrColor)
      try:
        f(*args, **kwds)
      finally:
        sys.stdout = oldStdout
        sys.stderr = oldStderr

    return wrapper

  return applyColorize


greenColor = '\033[01;32m'
redColor = '\033[01;31m'

def foo():
  print "I'm ordinary and boring!"
  print >> sys.stderr, 'Writing to stderr!'

@colorize(greenColor, redColor)
def colorFoo():
  print "I'm colorful and exciting!"
  print >> sys.stderr, 'Writing to stderr!'

if __name__ == '__main__':
  foo()
  colorFoo()
  foo()

它仍然可以稍微打磨一下,但是在大多数情况下它应该可以完成工作,并且可以适当地自行清理。当然,请记住,我使用的是特定于外壳的转义代码。如果您希望具有可移植性,则必须用对便携式终端控制模块的调用来替换转义代码

python 2022/1/1 18:49:56 有350人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶