32

确保使用特定 kwarg 调用方法的一种方法是:

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

提高 anAssertionError似乎不是最合适的做法。是否有一个商定的内置异常来处理这个带有很好的错误消息?

更多信息:存在需要传递 *args 和 **kwargs kinda' 的 3rd-party 子类化问题,因此将“required_field”作为位置参数并不是一个好的选择。

4

5 回答 5

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

我会选择 TypeError ..

于 2012-11-16T18:51:18.787 回答
26

+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)

(TypeError 建议已经给出(并被接受);我写这个答案是为了提到这个 Python 3 特性)。

于 2012-11-16T19:51:49.480 回答
18

标准库似乎喜欢TypeError在获得错误数量的参数时提出。这本质上是你的问题,所以我会提出这个问题。

也就是说,**kwargs大部分时间基本上都是填写默认参数,所以有一个必需的默认参数似乎有点令人惊讶/困惑。

请注意,python 很乐意让您通过关键字调用位置参数:

>>> 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)您可能不想要的关键字(不起作用)引用。

于 2012-11-16T18:51:32.383 回答
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')     
于 2012-11-16T19:01:06.297 回答
-2

如果您需要它成为必需的关键字,请执行以下操作:

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

你不应该真的需要从 kwargs 中提取它。

于 2012-11-16T18:52:48.890 回答