使用通用函数根据调用者执行操作?

时间:2016-03-15 09:34:07

标签: python

我有这个代码,可以很容易地在终端中为字符串着色,但它看起来非常重复。是否有更有效的方法来实现这一目标?

看起来非常简单,像字符串bluered等应该指向一个泛型函数,当你调用它时,你应该根据调用者的名字得到输出!

但显然这种事情不存在,除非我称之为争论。但后来我失去了编写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"]

2 个答案:

答案 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所需的所有方法。