2011-01-24 8 views
2

私はSOの答えを見つけることができませんが、議論はすでに議論されている可能性が非常に高いです。動的言語で誤ったパラメータタイプを扱うにはどうすればいいですか?

私はPython言語を使って非常に小さなプログラムを書こうとしています。ダイナミックな言葉を使った初めての「本当の」体験であり、すべてを正しい方法でやりたいと思っています。私が最初から適用しようとしている練習の1つは単体テストです。

メソッドのパラメータが適切な型であることを迅速にテストするにはどうすればよいですか?私はそれをすべきか?

これは、例えば、浮動小数点数で動作するメソッドがStringで呼び出されていないかどうかをチェックすることを意味します。この場合、浮動小数点数だけでなく、整数でも偶数を明示的に受け入れるべきである可能性を考慮してください。

答えて

3

メソッドのパラメータが適切な型であることを迅速にテストするにはどうすればよいですか?

最も簡単な方法は何もしないことです。

真剣に。動的言語インタプリタ(この場合はPython)は、あなたが今までに書くことができるコードよりもはるかに迅速にチェックします。それは単に例外を発生させ、それだけで必要なことです。何もない。

私はそれを行う必要がありますか?

正しいタイプをテストしないでください。一般的にはできません。

のは、あなたが「数」

def some_func(x): 
    assert isinstance(x, int) 

悪い政策を必要とする機能を持っているとしましょう。あなたの関数はint型だけでなくlong型やfloat型でも動作します。

assert instance(x, (int, long, float)) 

悪いポリシー。あなたはまだ複雑なものを除外しています。実際には、有効数字であるdecimal.Decimalfractions.Rationalも除外しています。

「タイプチェック」では、有効なタイプを除外します。あなたが行うことができる唯一のことは、型が適切であると仮定して、誰かがあなたの関数やクラスを誤用し、間違った型を与えたときに優雅に例外を処理することです。

TypeErrorを処理する最も優雅な方法は?

何もしない。プログラムは、が完全にクラッシュするはずです。

1

完全なカバレッジでユニットテストを行うことは、実際には動的言語に依存する開発作業を処理する唯一の方法です。明らかに、静的型付けされた言語に対して強力なカバレッジテストを行うことは非常に有益ですが、私の経験では、動的型定義を持つときにはさらに重要です。

テストで実行できるすべてのコードをカバーしていない場合は、本当に問題を求めています。したがって、カバレッジ分析ツールを単体テストと併用して、すべてのコードに到達していることを証明したいとします。

でも、すべての落とし穴を守ることはできません。実際のテストでは、プログラムが受け取る可能性のある誤った入力データエラーをすべて実行する必要があります。

3

特定の種類のテストは行わないでください。 docsによれば、渡されたオブジェクトを必要に応じて使い、ユーザーにカスタム実装を提供する機会を与えるだけです。

あなたの関数が何をするかによって、期待されるタイプに引数を変換するために適切かもしれない:

def my_func(a): 
    a = float(a) 
    # ...do stuff... 

もう一つの優れたオプションは、それを使用する前に、必要なメンバーを確認するためにhasattr()を使用することです。そうすれば、デフォルトのAttributeErrorではなく有用な例外がスローされます。

+2

"理想的には"削除できます。型の "テスト"はしません。インタプリタはタイプをテストします。あなたはそのオブジェクトを使うだけです。 –

関連する問題