2013-05-15 33 views
5

我有以下變量,用戶可以通過表單提交(它們不是必需的,但可以這樣做以過濾搜索)。Python - 只有在變量存在的情況下才傳遞參數

color = request.GET.get ('color') 
size = request.GET.get ('size') 

現在我想將這些變量傳遞給一個函數,但只有當它們存在。如果它們不存在,我想只運行沒有參數的函數。

不帶參數的功能是:

apicall = search() 

顏色只是它

apicall = search (color) 

,並用顏色和大小是

apicall = search (color, size) 

如果參數定義我想通過它的功能,但如果不是我不想通過它。

什麼是最有效的方法呢? python是否有內置的方法?

回答

6

假設這是一個標準的get調用(就像在字典上),這應該很容易。用None定義你的函數默認爲你的參數,然後通過colorsize而不必麻煩檢查它們!

def apicall(color=None, size=None): 
    pass # Do stuff 

color = request.GET.get('color') 
size = request.GET.get('size') 
apicall(color, size) 

這樣,你只檢查None參數在一個地方(函數調用,你無論如何都要檢查函數可以調用多種方式內)。一切都很好,很乾淨。當然,這假定(就像我在頂部所說的那樣),你的get調用就像是一個普通的Python字典的get方法,如果找不到該值,返回None

最後,我注意到你的函數名是apicall:有可能你實際上並沒有訪問函數代碼本身。在這種情況下,由於您可能不知道函數簽名的默認值,並且None可能是錯誤的,所以我可能只會寫一個簡單的包裝來爲您進行參數檢查。然後你可以像上面那樣調用包裝器!

def wrapped_apicall(color=None, size=None): 
    if color is None and size is None: 
     return apicall() 
    # At least one argument is not None, so... 
    if size is None: 
     # color is not None 
     return apicall(color) 
    if color is None: 
     # size is not None 
     return apicall(size) 
    # Neither argument is None 
    return apicall(color, size) 

注:這第二個版本除非你不能看到你打電話,並沒有關於它的任何文件的代碼應該沒有必要!使用None作爲默認參數非常常見,因此您可以使用第一種方式。如果你不能修改你調用的函數,並且你不知道它的默認參數是什麼(或者它的默認參數是模塊常量或者某些東西,但這很少),我只會使用包裝器方法。

+0

是的,但如果我的一個變量沒有被定義那麼'apicall(顏色,大小)'會拋出一個錯誤,不是嗎? – user1328021

+0

好的,謝謝......你寫的是我如何設想完成的,但我一直認爲必須有更高效的方法...... – user1328021

+0

@ user1328021假設這兩行都執行:'color = request.GET .get('color')'和 'size = request.GET.get('size')',那麼'color'和'size'都保證**定義**,儘管它們可能是None '。你認爲這樣做效率低下? –

0

當你定義你的方法時,如果你設置了一個默認參數,你可以指定參數或不參與。

def search(color=None, size=None): 
    pass 

然後,當您調用它時,您可以指定關鍵字參數,如您所選。這兩個是有效的:

apicall = search(color=color) 
apicall = search(size=size) 
0

meybe你可以使用這樣的事情:

try: 
    apicall = search (color, size) 
else: 
    apicall = search(color) 
+0

,不會工作...大小是無,但它仍然存在... –

相關問題