Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:必需kwarg,要引发哪个异常?_Python_Exception - Fatal编程技术网

Python:必需kwarg,要引发哪个异常?

Python:必需kwarg,要引发哪个异常?,python,exception,Python,Exception,确保使用特定kwarg调用方法的一种方法如下: def mymethod(self, *args, **kwargs): assert "required_field" in kwargs 提出AssertionError似乎不是最合适的做法。是否有一个商定的内置异常来处理这个问题,并显示一条漂亮的错误消息 更多信息:存在第三方子类化问题,其中需要传递*args和**kwargs,因此将“required_field”作为位置参数并不是一个好的选择。>>def foo(bar):传递

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

def mymethod(self, *args, **kwargs):
    assert "required_field" in kwargs
提出
AssertionError
似乎不是最合适的做法。是否有一个商定的内置异常来处理这个问题,并显示一条漂亮的错误消息

更多信息:存在第三方子类化问题,其中需要传递*args和**kwargs,因此将“required_field”作为位置参数并不是一个好的选择。

>>def foo(bar):传递
>>> def foo(bar): pass
... 
>>> foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() missing 1 required positional argument: 'bar'
... >>>foo() 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:foo()缺少1个必需的位置参数:“bar”

我只想使用TypeError..

当标准库获得错误数量的参数时,它似乎喜欢提出
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)
不起作用),而这可能是您不想要的。

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

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

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

我认为
键错误
最合适,因为
**kwargs
是一个
命令

>>> 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'

+1表示类型错误。这是Python3为仅限关键字的必需参数提出的:

>>> 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)
def foo(*,x): ... 通过 ... >>>foo() 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:foo()只需要关键字参数x >>>傅(2) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:foo()只接受0个位置参数(给定1个) >>>foo(x=2)

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

我认为标准的做法是不要将其设置为“默认参数”。已经有一些我不想弄乱的位置参数。更一般地说,也有一些情况是kwargs可以接受多个键,只有在满足与其他关键字参数的存在或值相关的特定条件时,才会需要一些键。只需添加
*args,**kwargs
:)
keyrerror
通常直接应用于数据结构,而OP想要通知函数签名的滥用;人们可能会想到,当语言本身支持必需的关键字参数时,他们应该自己处理异常(当然,除非他们不幸被Python 2困住了)。我在这里搜索必需的kwargs的语法,所以也从我这里得到+1。“
**kwargs
在大多数情况下基本上是默认参数的填充”“没有。这是一个用途,但是
**kwargs
还有其他几个重要用途:1)在子类可能需要不同行为的超类中,2)当您有一个很长的参数列表时,您不希望客户端必须记住参数的顺序
**kwargs
避免了大量混乱。毫无疑问还有其他的,但这些是最先想到的。前一个(超类)最终引导我找到了这条线索。
>>> 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)