2016-07-28 14 views
0

Pythonは明示的な型チェックよりもダックタイピングを奨励しています。ただし、型を明示的にチェックすると便利なことがあります。アサーションとライブラリAPIの型チェックの例外との比較

Pythonライブラリで型チェックが必要な場合は、アサーションまたは例外を使用する必要がありますか?

def foo(bar): 
    assert isinstance(bar, str) 

def foo(bar): 
    if not isinstance(bar, str): 
     raise TypeError 

ライブラリのAPIは公開APIであり、公開APIは明示的に例外を発生させる必要があります。しかし、(ユーザー入力検証ライブラリでない限り)ユーザー入力の検証を行うライブラリの責任であってはなりません。また、ライブラリが「誤って使用される」ように設計されることも妥当ではありません。ライブラリを使用しているプログラムは、TypeError例外をキャッチしません。適切なタイプのライブラリAPIを代わりに呼び出すように修正されました。

例外を発生させる代わりに、アサーションでライブラリタイプのチェックを行う必要がありますか?

+1

合理的であることを確認するために、関数を呼び出した後、210

  • 。図書館の消費者として、私は主張の失敗を見て驚くだろう。私が 'コレクションをインポートしようとすると、 c = collections.defaultdict(1) 'アサーションエラーではなくTypeError例外が発生しました。なぜ標準ライブラリの外にあるパッケージが違う振る舞いをするべきですか? – larsks

  • +0

    あなたの状況に適した方法を実行する必要があります。明示的な型チェックはしばしば必要ではありませんが、何かを処理する最善の方法です。その場合は、isinstance()を使用することをお勧めします。そうすれば、何が間違っているのかをユーザーに知らせるメッセージで例外を呼び出すことができます。 – IanAuld

    答えて

    -1

    アサーション評価は、-Oコマンドラインオプションを使用してpythonを実行することで無効にすることができます。このオプションは、本番環境よりも広範囲にチェックしたい場合に便利です。

    https://wiki.python.org/moin/UsingAssertionsEffectivelyを見てください - 彼らは私よりも多くを知っていると彼らは言う:アサーションを置くことを検討する

    場所:パラメータの型、クラス、またはデータをチェック

  • 値をチェック

    • を構造不変式
    • "起こり得ない"状況をチェックする(リスト内に重複している、矛盾する状態変数)
    • そのリターンは私が `assert`デバッグ/テストツールとして使用されるべきだと思う
  • 関連する問題