32

メソッドが特定の kwarg で呼び出されるようにする 1 つの方法は、次のようになります。

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

を上げることAssertionErrorは、最も適切なことのようには思えません。素敵なエラーメッセージでこれを処理するための合意された組み込み例外はありますか?

詳細情報: *args と **kwargs kinda' を渡す必要があるサードパーティのサブクラス化の問題があるため、「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

TypeError の場合は +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 に答える