2011-11-28 3 views
17

私の関数の1つが引数の値が必要なところでNoneが渡されたことを検出したときに発生させる "適切な"例外クラスは何ですか?例えば:引数として何も検出されなかった場合に発生する適切な例外

def MyFunction(MyArg1, MyArg2): 

    if not MyArg2: 
      raise ?Error? 

私は私がここで使用TypeErrorを見てきたと思います(と、それは私が他のいくつかのタイプが期待されているNoneTypeを受けてることは事実だ)それは、このような状況のためとして、かなり右に私に当たりません例外がより明白になると私は思う。

+0

このような種類の引数チェックは一切行うべきではありません。それが失敗した例外があれば、それをさらに失敗させてください。 (実際に*必要な場合は、 'TypeError'が正しい例外です。より具体的にするために説明文字列を追加してください。) –

+0

おそらく、' TypeError'を発生させ、組み込みのPythonの例外を見てくださいドキュメンテーション:http://docs.python.org/library/exceptions.html –

+0

@Sven:私は通常あなたが提案した通りですが、これは私がこのチェックをしたい特別なケースです。 –

答えて

29

Pythonでは「無効な引数」または「nullポインタ」の組み込み例外はありません。代わりに、ほとんどの関数はTypeError(無効なタイプ、例えばNoneType)またはValueError(正しいタイプですが、その値は受け入れられたドメインの外です)を上げます。

あなたの関数が特定のクラスのオブジェクトを必要とし、その代わりにNoneを取得した場合は、指摘したようにTypeErrorになるはずです。

if MyArg2 is None: 
    raise TypeError 

Pythonのドキュメント

  • TypeError正しい型のオブジェクトは、それが__nonzero__/__bool__を実装している場合Falseブールために評価してもよいので、この場合は、あなたは、しかし、明示的にNoneをチェックする必要がありますpython2/python3
  • ValueErrorpython2/python3
-1

だけアサート使用:これはあなたの間違った型を渡すだけでなく、なしの問題に対処するから誰かを防ぐことができます

assert type(MyArg2) != None 

assert type(MyArg2) == int 

または代わりに。 AssertionErroras per the docs.

+1

これは、Pythonのダックタイピングの精神に完全に反しています。それはコードの適用性に不必要な制限を課す。 (私のdownvote、btwではない) –

+1

@SvenMarnachうーん、私はダックの入力のために*うまく使用しました。つまり、ダックタイピングは*なぜ*何かが失敗していることを隠しました。あなたがこれを言う必要があることがわかっていて、始める前にそれがそうでなければならない場合、断言は単にそうする便利な方法です。たとえば、入力変数にforループを使用して関数を記述します。 globbingのためのファイル名のリストであると仮定されます。 1つの項目でリストを渡す代わりに、glob文字で文字列を渡すとどうなりますか? –

+1

アサートの問題は、長い整数や浮動小数点(多くの場合、 'range()'など)、 '__int__を実装するオブジェクトを含む(この例では)整数として完全にうまく機能する値を無視するということです() '特別なメソッドです。より良いアプローチは、このようなことが必要だと感じる場合、メソッドの早い段階でintegerに引数を強制的に強制しようとするかもしれません。 'MyArg2 = int(MyArg2)'。 – kindall

2

Noneが引数として渡された場合、ほとんどのPython関数はTypeErrorを返します。どんな機能を持っていてもchr(None)とすれば、それがTypeErrorになるのを見てください。

2

他に記載されているように、TypeErrorまたはValueErrorは自然であろう。それが十分に具体的ではないと思われる場合は、2つの例外のうちどちらが優れているかをサブクラス化できます。これにより、広範なクラスの関数に対して無効な引数を一貫して扱うことができます。同時に、特定の関数の詳細を提供します。

関連する問題