2015-12-14 57 views
3

假設我有很多接受某種格式輸入的函數。Python:爲許多功能提供參數轉換

假設我想向我的模塊的用戶提供以另一種格式輸入這些函數的選項。轉換很簡單。

我不喜歡在每個單獨的函數中進行轉換,我覺得只做一個我的函數的複製粘貼然後手工插入轉換是不好的做法。

我也覺得,我不應該手動去每個函數,並將其更改爲* args和** kwargs簽名,並插入大量樣板代碼,說:「如果你的一個kwargs是這樣,做如果是這樣的話,就這樣做「。

什麼是這種事情的好方法?動態函數生成加裝飾器?還有其他的東西嗎?

+2

也激發了定義 「格式」。爲什麼不寫一個適配器函數來做任何需要的轉換? – timgeb

+1

你爲什麼不做每個函數內部的轉換?另外,我發現很難理解這個和它的用途很好,有一個例子,你的意思是不同的格式和功能看起來像 –

+0

@timgeb我有一個適配器功能,但想要轉移調用的負擔從模塊的最終用戶到模塊的開發人員。就像我們說的那樣,我的模塊在鄰接矩陣格式中使用圖形,但我想提供將圖形接受爲鄰接列表的函數簽名。 當然,我可以在每個功能中進行轉換,但感覺像做了大量的複製和粘貼,我想知道是否有辦法更優雅地做到這一點。也許通過一些裝飾ala「@conversion」 – Lagerbaer

回答

2

您仍然必須爲每個函數針對參數的不同重載定義要執行的操作。至少爲了定義哪個簽名被重載而不是。見下面的代碼。 foo超負荷,不變富富不是。

這裏是什麼例子,你可以通過Guido van van Rossum

from mm import multimethod 

@multimethod(int) 
def foo(i): 
    ...code for int... 

@multimethod(list): 
def foo(List): 
    for i in List: 
     foo(i) 

def UnchangedFoo(i): 
    ...some code...