2012-11-16 27 views
24

的一种方式,以确保一个方法被称为与特定kwarg会是这样:Python:需要kwarg,哪个异常提升?

def mymethod(self, *args, **kwargs): 
    assert "required_field" in kwargs 

提高的AssertionError似乎并不像最合适的事情。是否有一个内置的异常协议来处理这个错误信息?

更多信息:有第三方子类问题,其中* args和** kwargs kinda'需要通过,因此使“required_field”成为位置参数并不是一个好的选择。

+5

我认为标准的事情是不要让它成为'默认参数'。 – mgilson

+0

已有位置参数,我不想混淆。 –

+0

更一般地说,还有一些情况是kwargs可以接受大量的密钥,只有当关于其他关键字参数的存在或值满足特定条件时才需要一些密钥。 –

回答

27
>>> def foo(bar): pass 
... 
>>> foo() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: foo() missing 1 required positional argument: 'bar' 

我只是去与类型错误..

13

标准库似乎想提出TypeError时,得到了错误的参数数目。这基本上是你的问题,所以我会提出这个问题。

也就是说,**kwargs在大多数情况下基本上填充默认参数,所以有必要的默认参数似乎有点令人惊讶/混淆。

注意,蟒蛇会很乐意让你通过关键字调用位置参数:

>>> def foo(a, b): 
...  print a, b 
... 
>>> foo(a=1, b=2) 
1 2 
>>> foo(b=1, a=2) 
2 1 

,但我想,那么他们所有必须通过关键字(foo(2, a=2)不工作)被引用,你可能不想。

+0

“** kwargs'实质上是在大多数情况下填写默认参数”。不是真的。这只是一个用法,但** kwargs'还有其他一些重要用途:1)在超类中,子类可能需要不同的行为,2)当您有一个长参数列表,您不希望客户必须记住订单的参数'** kwargs'避免了很多混乱。毫无疑问,其他人,但这些是第一个想到的。前者(超类)最终导致我走向这条线索。 –

0

如果你需要它是一个必需的关键字,这样做:

def mymethod(self,myrequired=None): 
    if myrequired==None: 
     #raise error 
    #do other stuff down here 

你不应该真的需要从kwargs拉出。

+0

只需添加'* args,** kwargs' :) –

0

我认为KeyError将是最合适的,因为**kwargsdict

>>> def foo(**kwargs): 
... print kwargs['abc'] 
... 
>>> foo() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in foo 
KeyError: 'abc' 

如果有需要,你可以检查它

try: 
    kwargs['required'] 
except KeyError: 
    raise KeyError('required is a Required Argument')  
+1

'KeyError'通常直接应用于数据结构,而OP想要通知误用函数签名。 – jdi

11

+1的类型错误。这是Python 3中提出的要求只有关键字的参数:

>>> def foo(*, x): 
...  pass 
... 
>>> foo() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: foo() needs keyword-only argument x 
>>> foo(2) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: foo() takes exactly 0 positional arguments (1 given) 
>>> foo(x=2) 

(类型错误的建议已经给(和接受);我写了这个答案,何况这Python 3的功能)。

+1

提到Python 3关键字参数在这里非常有用;人们可能会想到这个问题,认为当语言本身支持必需的关键字参数时(除非它们不幸被Python 2卡住),他们应该自己处理异常处理。 –