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

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

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

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

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

#!/usr/bin/python2import sysdef colorize(stdoutColor, stderrColor):  defaultColor = '33[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 applyColorizegreenColor = '33[01;32m'redColor = '33[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()

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



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5667295.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存