gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:35:08 24 4
gpt4 key购买 nike

我怎样才能装饰一个函数,让它打印到 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com