2011-08-03 44 views
4

我有以下功能:檢測無效的關鍵字參數

def foo(**kwargs): 
    if not kwargs: 
    # No keyword arguments? It's all right. Set defaults here... 
    elif ('start_index' or 'end_index') in kwargs: 
    # Do something here... 
    else: 
    # Catch unexpected keyword arguments 
    raise TypeError("%r are invalid keyword arguments" % (kwargs.keys()) 

問:

我想確保唯一有效的關鍵字參數start_indexend_index。其他任何情況都會引發錯誤,即使混入了有效的錯誤也是如此。什麼是食譜配方,以確保只有start_indexend_index被接受?是的,我正在尋找食譜食譜,但我不確定如何搜索它。我不確定使用if-elif-else結構是否是正確的方法。

+0

的關鍵。你知道,在kwargs''(「START_INDEX」或「END_INDEX」)不會做什麼你可能想要? '字符串1或string2'將收益率這兩個字符串(最有可能的'string1')之一,所以你的榜樣_永遠_檢查'「END_INDEX」在kwargs'。像'(start_index','end_index')中的kw:如果kw在kwargs中......'會提示我這麼做 –

回答

3

爲了完整起見,這裏是一個仍然使用**kwargs的替代品。

def foo(**kwargs): 
    start_index = kwargs.pop('start_index', STARTINDEX_DEFAULT) 
    end_index = kwargs.pop('end_index', ENDINDEX_DEFAULT) 
    if kwargs: 
    # Catch unexpected keyword arguments 
    raise TypeError("%r are invalid keyword arguments" % (kwargs.keys()) 
    # Do something here... 

,你不應該想用這個當你不是絕對需要的,請使用默認值常規參數(如羅馬Bodnarchuk的答案)。

您可能需要的情況是,您還需要使用*args,並且需要一種方法將關鍵字參數與任意人的位置參數區分開來。使用**kwargs這樣作爲關鍵字傳遞關鍵字參數;一個位置參數永遠無法進入**kwargs

另一個原因是,你可以真的區分默認和顯式參數,這恰好是默認的。 None通常用作參數的默認值來表示「參數不適用」,但有時您實際上需要將None解釋爲非默認值。檢查**kwargs字典中是否存在密鑰可以準確區分這些情況。 (另一種方法是創建的object衛生組織唯一目的一個子類的實例是爲特定的參數到該特定功能的默認值)

12

爲什麼你需要**kwargs在這裏?只需

Python將爲您執行所有驗證。

+0

+1。我忘了在我的問題中明確指出使用'** kwargs'是必要的。 – Kit

1

如果你真的想用**kwargs,我會寫,像:

def foo(**kwargs): 
    # Define default values for all keys 
    args = {'start_index': 0, 'end_index': -1} 

    # Get the keys passed in that aren't in args 
    extraargs = set(kwargs) - set(args) 
    if extraargs: 
     raise TypeError("Invalid arguments: %s" % list(extraargs)) 

    # Overwrite the default values with the passed-in values 
    args.update(kwargs) 

    # Now, do stuff with the values in args 

但所有這一切是複製內置功能複雜,緩慢的方式。除非你真的需要,否則不要這樣做。

0

在任何情況下從一個字典獲取密鑰作爲使用.get例如作爲易

kwargs.get('WIDTH',500)

這樣,如果它沒有找到寬度,你會得到500