2012-11-16 1 views
24

一つの方法は次のようになります。良いエラーメッセージでこれを処理するための合意された組み込み例外がありますか?Python:必要なkwarg、発生する例外はありますか? <code>AssertionError</code>を上げることは行うには、最も適切なもののように見えるしていません</p> <pre><code>def mymethod(self, *args, **kwargs): assert "required_field" in kwargs </code></pre> <p>:メソッドは、特定のkwargで呼び出されることを保証する

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

私は標準ライブラリが、それは間違った数の引数を取得するときにTypeErrorを上げたいようだ。..

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)が動作しません)キーワードによって参照する必要があるとし、あなたがいないことがあります。Pythonは喜んであなたがキーワードで位置引数を呼び出すようになることを

注意欲しいです。

+0

"** kwargsは基本的にはほとんどの場合、デフォルトの引数を埋めます。"あんまり。それは1つの使い方ですが、 '** 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

**kwargsdictなので、KeyErrorが最も適切だと思います。フィールドが実際に必要とされる場合

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

することは、あなたはTypeError例外のためにそれ

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

' KeyError'は通常データ構造に直接適用されますが、OPは関数シグネチャの誤用を通知したいと考えています。 – jdi

11

+1をチェックすることができます。

>>> 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機能を言及するために、この答えを書いてはTypeErrorの提案がすでに)与えられた(と受け入れられた):これは、Python 3が必要なキーワードのみの引数に対して提起するものです。

+1

Python 3のキーワードのみの引数については、ここで非常に役に立ちます。この質問には、言語自体が必須のキーワード引数をサポートしているときに例外処理を行うべきだと思っているかもしれません(ただし、Python 2には不幸なことはありません)。 –

関連する問題

 関連する問題