2011-08-03 39 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