如何装饰函数,以便将打印到stdout
的所有内容显示为绿色,将其打印到stderr
的所有内容显示为红色?我有可用的termcolor
模块。
额外的因果报应:如何将参数传递给装饰器以指定颜色,将其默认设置为红色和绿色?
最佳答案
一个有趣的问题。最简单的解决方案将类似于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()
它仍然可以稍微打磨一下,但是在大多数情况下它应该可以完成工作,并且可以正确地对其进行清理。当然,请记住,我使用的是特定于 shell 的转义代码。如果您希望具有可移植性,则必须用对便携式终端控制模块的调用来替换转义代码。
关于python - (python)在函数中使用装饰器进行彩色打印,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6195877/