我有这个代码,可以很容易地在终端中为字符串着色,但它看起来非常重复。是否有更有效的方法来实现这一目标?
看起来非常简单,像字符串blue
,red
等应该指向一个泛型函数,当你调用它时,你应该根据调用者的名字得到输出!
但显然这种事情不存在,除非我称之为争论。但后来我失去了编写blue(bold(italics("Foo")))
的灵活性,这是最终用户操作的最佳方式。
我可以在内存中使用单个函数对象并更有效地执行此操作吗?
bcolors = {"BLUE": '\033[94m',
"HIGH": '\033[93m',
"OKAY": '\033[92m',
"FAIL": '\033[91m',
"BOLD": '\033[1m',
"LINE": '\033[4m',
"ENDC": '\033[0m'
}
def blue(string):
return bcolors["BLUE"] + string + bcolors["ENDC"]
def yellow(string):
return bcolors["HIGH"] + string + bcolors["ENDC"]
def green(string):
return bcolors["OKAY"] + string + bcolors["ENDC"]
def red(string):
return bcolors["FAIL"] + string + bcolors["ENDC"]
def bold(string):
return bcolors["BOLD"] + string + bcolors["ENDC"]
def line(string):
return bcolors["LINE"] + string + bcolors["ENDC"]
答案 0 :(得分:1)
一个函数不应该根据谁调用它来改变它的行为;只有它的论据才能影响它的行为,其他任何东西都是疯狂的。
明显的重构让它在这里干燥将是这样的:
def _format(start, string):
return bicolors[start] + string + bcolors['ENDC']
def blue(string):
return _format('BLUE', string)
如果将它包装在具有一些魔术属性或方法调用覆盖的类中,您甚至可以从函数调用中开始派生'BLUE'
参数。
答案 1 :(得分:1)
如何在飞行中构建它们?:
bcolors = {"BLUE": '\033[94m',
"HIGH": '\033[93m',
"OKAY": '\033[92m',
"FAIL": '\033[91m',
"BOLD": '\033[1m',
"LINE": '\033[4m',
"ENDC": '\033[0m'
}
def _genF(color):
return lambda s: bcolors[color] + s + bcolors["ENDC"]
globals().update({k.lower():_genF(k) for k,v in bcolors.items()})
In[10]: blue("Foo")
Out[10]: '\x1b[94mFoo\x1b[0m'
In[11]: blue(bold(okay("Foo")))
Out[11]: '\x1b[94m\x1b[1m\x1b[92mFoo\x1b[0m\x1b[0m\x1b[0m'
这样你就可以使用bcolors dict信息来修改你需要修改dict所需的所有方法。