2016-03-15 99 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

相關問題