2016-03-15 91 views
1

我有这个代码,它可以很容易地在终端上给一个字符串上色,但它看起来确实是重复的。有没有更有效地做到这一点的功能性方法?使用通用函数来做基于调用者的东西?

看起来真的很琐碎,像字符串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"] 
+2

函数不应该根据* who *调用它的行为来改变它的行为;只有它的论据应该影响它的行为,其他任何事情都是疯狂的。 – deceze

+0

是的,纯粹的函数式编程,我同意。所以基本上没有解决这个问题比创建这么多的函数对象?我只是想重申一下。 – Nishant

+2

我不知道你为什么喜欢蓝色(粗体(斜体(“Foo”)))''。我更喜欢'style(“Foo”,BLUE,BOLD,ITALICS)',其中样式参数都是可选的,并且可以按任意顺序给出。另外,我的方法可以更容易地消除多余的''\ 033 [0m''序列。 –

回答

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字典为博尔丁所有你需要的只是modifiying的字典方法的信息。

+0

不是建在飞行中更昂贵?我也试图尽可能减少内存占用。 – Nishant

+3

“locals”注释的文档,它不是保证的,但是如果更新返回的字典将会影响实现,这实际上会影响本地范围。 globals()不是这种情况,它会返回一个保证将更新传播到全局作用域的字典。 – Callidior

+0

如果你看输出,它总是返回'\ x1b [4m'作为开始序列。当你在循环中定义一个函数时,你需要使用关键字参数来解决这个问题:'lambda s,k = k:....' – falsetru

1

一个函数不应该根据谁调用它来改变它的行为;只有它的论据应该影响它的行为,其他任何事情都是疯狂的。

明显的重构,使之干燥机在这里会沿着这些路线的东西:

def _format(start, string): 
    return bicolors[start] + string + bcolors['ENDC'] 

def blue(string): 
    return _format('BLUE', string) 

如果你把这个包在一类具有一些特殊的属性或方法调用覆盖,你甚至可以开始推导'BLUE'参数来自函数调用。

+0

类的方法根据上下文而变化,这也是我在这里的用例。但是,有人告诉我,使用一种方法来解决这个问题不是一个好方法吗?像类方法一样会根据self.style属性来完成这种格式化,现在我最终创建了n个颜色对象,并且有一个类方法可以完成这种格式化字符串的工作。我也可以让对象返回,直接调用方法,也许使用'__call__'属性。那有意义吗?你认为这是一个很好的解决方法吗? – Nishant

+0

不知道你想说什么。 – deceze

+0

现在有道理吗?只是好奇,想知道我是否可以说出我的观点!函数不应该依赖于外部上下文,但是类方法没有这个限制,但它是一个函数,因此我也在考虑这种方法。 – Nishant

相关问题