2014-01-10 24 views
6

我是新來的Python和一般的高級語言,所以如果是看不起我想知道在,如果我有一個函數,它在不少爭論,以及如何更好地建築師我的代碼來防止這種情況。Python函數有不少爭論

例如這是什麼功能基本上做的是打印在一個文件中的字符串的每個位置。

def scan(fpin,base,string,pNo,print_to_file,dumpfile_path,quiet): 

這個函數被主函數調用,它主要是解析命令行參數並將數據傳遞給掃描函數。我曾想過創建一個包含所有這些參數並將其傳遞給掃描的類,但是隻有這個數據的一個實例,所以這不是毫無意義的?

+3

除了還可以考慮重構你的功能:不是,那麼你可以這樣做。如果它正在採取如此多的論點,或許它也做了很多不同的事情?也許你可以將這些過程中的一部分分離並抽象成不同的功能? –

回答

6

命名的參數是你的朋友。對於具有合理默認設置的半可選配置選項,請將參數設置爲默認值,並且僅將它們(作爲命名參數)傳遞給非默認情況。如果有許多參數沒有合理的默認值,那麼當你調用函數時,你可能想要命名所有這些參數。

考慮內置函數sorted。它最多需要四個參數。 cmp之前或之後是reverse參數嗎?如果我想要默認行爲,我應該通過什麼作爲key?答:如果我能記得,地獄。我打電話sorted(A, reverse=True),它做我期望的。順便說一句,如果我有大量的「config」風格的參數傳遞給每次掃描調用,並且每次只更改(例如,fpinstring),我可能傾向於將所有其他參數輸入到字典中,然後使用**kwargs語法將其傳遞給函數。這是更先進一點。詳情請參閱手冊。 (請注意,這與聲明功能不同於**kwargs,功能定義相同,唯一不同的是調用它的樣子。)

1

不,它確實沒有什麼問題。如果你有N個不同的參數(控制你的函數執行的東西),你必須以某種方式傳遞它們 - 如果你問我,你實際上怎麼做只是用戶偏好。

但是......如果你發現自己做這樣的事情,雖然:

func('somestring', a=A, b=B, c=C) 
func('something else', a=A, b=B) 
func('something third', a=A, c=C, d=D) 

等,其中A,B,C是真正配置對於很多不同的東西,那麼你應該開始尋找到一個類。一個類有許多事情,但它也創造了上下文。從下面你所提到的所有好的解決辦法

cf = myclass(a=A, b=B, c=C, d=D) 
cf.func('somestring') 
cf.func('something else') 
cf.func('something third')