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

标签 python function decorator

我怎样才能装饰一个函数,让它打印到 stdout 的任何东西都是 green 而它打印到 stderr 的任何东西都是 红色?我有可用的 termcolor 模块。

Bonus karma:如何将参数传递给装饰器以指定颜色,将它们默认为红色和绿色?

最佳答案

一个有趣的问题。最简单的解决方案与皮特建议的类似。在将函数运行到每个 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()

这仍然可以稍微改进一下,但在大多数情况下它应该可以完成工作并在适本地清理之后。当然,请记住我使用的是特定于 shell 的转义码。如果您想要可移植性,则必须将转义代码写入替换为对可移植终端控制模块的调用。

关于python - (python)在函数中使用装饰器进行彩色打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6195877/

相关文章:

Python 类型错误 : unsupported operand type(s) for ^: 'float' and 'int'

javascript - 在 JScript/Javascript 中创建 YYYY-MM-DD 日期范围

python:为什么os.makedirs会导致WindowsError?

function - 如何访问同一包中但来自不同文件的未导出函数

C 通过引用字符串传递

python - 对类方法使用 pydispatch 和装饰器

Java:带通知的 List<E> 装饰器实现

zend-framework - Zend 表单显示组装饰器

python - 在 Python 3.x 的整数列表中限制用户输入

python - 在 Python 中解析日期字符串