检测无效的关键字参数

Kit*_*Kit 4 python arguments keyword

我有以下功能:

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())
Run Code Online (Sandbox Code Playgroud)

题:

我想确保唯一有效的关键字参数是start_indexend_index.其他任何东西都会引发错误,即使与有效的混合也是如此.什么是食谱配方,以确保只有start_index或被end_index接受?是的,我正在寻找食谱配方,但我不确定如何搜索它.我不确定使用if-elif-else结构是否也是正确的方法.

Rom*_*huk 12

你为什么需要**kwargs这里?只是

def foo(start_index=None, end_index=None):
Run Code Online (Sandbox Code Playgroud)

Python将为您执行所有验证.


Sin*_*ion 5

为了完整起见,这是一个仍然使用的替代方案**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...
Run Code Online (Sandbox Code Playgroud)

但是,当你不完全需要时,你不应该使用它,使用带有默认值的常规参数(如Roman Bodnarchuk的回答).

您可能需要这种情况的情况是您还想使用时*args,需要一种方法来区分关键字参数和任意人位置参数.使用**kwargs这种方式强制关键字参数作为关键字传递; 位置论证永远无法进入**kwargs.

另一个原因是您可以真正区分默认参数和默认参数. None通常用作参数的默认值来表示"参数不适用",但有时您实际上需要将其解释None为默认值以外的其他值.检查**kwargsdict中是否存在键可以准确区分这些情况.(另一种方法是创建一个子类的实例,其object唯一目的是作为该特定函数的特定参数的默认值)