2015-05-19 67 views
2

我是一名Python初學者,我面臨一個需要可選參數的函數的問題。 該函數獲取可變數量的文件路徑的參數,可以是2到n個參數。此後,可以將一定數量的可選參數傳遞給此函數。 我試圖做這樣的事情:如何在python中使用可選參數正確調用函數

def compareNfilesParameters(*args): 
    start_time = time.time() 

    listFiles = [] 
    listParameters = [] 

    for argument in args: 
     if str(argument).endswith(".vcf"): 
      listFiles.append(str(argument)) 
     else: 
      listParameters.append(argument) 

因此,如果參數文件的擴展名爲它被認爲是文件路徑參數之一,其他被視爲可選參數。

我想要做的就是讓用戶調用的功能等:

function('a.vcf', 'b.vcf', 'c.vcf') 

function('a.vcf', 'b.vcf', 'c.vcf', 0, 1) 

function('a.vcf', 'b.vcf', 'c.vcf', 0, 1, 4,...,3) 

我嘗試不同的方法,但他們沒有滿足我。

第一種方法是在聲明函數爲:

def compareNfilesParameters(*args) 

但這樣一來,如果我得到例如3個參數,2肯定會有的文件路徑,最後一個我不知道的它指的是哪個變量。所以我需要指定每個值併爲我想要使用默認值的參數傳遞'-1'。

的第二個方法是:

def compareNfilesParameters(*args, par1 = 10, par2 = 15 ..) 

但這種方式我需要調用的功能等:

compareNfilesParameters(path1, path2, path3, par1 = 10) 

,而不是像

compareNfilesParameters(path1, path2, path3, 10) 

或10將在參數輸入中被考慮,對吧?我不想使用這種方法,因爲它調用該函數變得非常冗長。

你會如何做到這一點?

+0

如果你提供一個默認值,如果你不想改變默認值,你不需要傳遞任何東西給函數。例如,如果你做了'def foo(a,b,c = 10)',如果你不想改變'c'的值,你可以用'foo(a,b)'調用函數。 – IanAuld

+0

如何簡單地使用一個將所有路徑作爲列表或元組並且所有其他參數都是可選的參數?像''compareNfilesParameters(files,* args)'' – SmCaterpillar

回答

3

使用戶按照序列傳遞文件名;不要嘗試所有東西都塞進單獨的參數:

def compareNfilesParameters(files, *params): 

,並把這種爲:

compareNfilesParameters(('a.vcf', 'b.vcf', 'c.vcf'), 0, 1, 4) 

這使得文件明確和消除了需要從其他參數單獨的文件。

如果你的其餘參數與不同的選項(而不是同質的一系列整數),我會使用關鍵字參數:

def compareNfilesParameters(files, op1=default_value, op2=default_value, op3=default_value): 

你不使用的關鍵字關鍵字參數打電話時;你仍然可以把他們當作位置:

compareNfilesParameters(('a.vcf', 'b.vcf', 'c.vcf'), 0, 1, 4) 

會給op1價值0op2價值1,並且op34。只有當你想指定的值不按順序或特定的選項,你必須在調用中使用關鍵字參數:

compareNfilesParameters(('a.vcf', 'b.vcf', 'c.vcf'), op3=4) 
+0

好的,假設我加了這個。 如果我只想指定第三個參數,我該如何調用該函數?而且,在函數中,我能理解我得到的參數是指那個特定的參數嗎? – lateralus

+1

@lateralus:您的問題在這些可選參數上不明確;他們是一系列*同質數字*或具體參數?如果後者使用關鍵字參數,那麼它們也可以用作位置參數*,除非您省略一些參數。 –

0

好吧,我喜歡解決使用關鍵字參數的建議。

def compareNfilesParameters(listFiles, **kwargs): 
    start_time = time.time() 

    if len(listFiles) < MINUMUM_FILES_NUMBER : 
     print "You need to specify at least "+ str(MINUMUM_FILES_NUMBER) +" files." 
     return 

    try: 
     operationType = int(kwargs.get("op", DEFAULT_OPERATION_TYPE)) 
    except ValueError: 
     print "Operation type filter has to be an integer." 
     return  
    if operationType not in [0,1]: 
     print "Operation type must be 0 (intersection), 1 (union)" 
     return 

等等所有參數。 像這樣,我需要將所有文件路徑放在一個列表中,並將其作爲單個必需參數傳遞,並搜索kwargs字典中的optionals參數,如果不表示,則設置默認值。

相關問題