2017-10-11 8 views
0

質問は良いと悪い練習に関連しています: 私は関数の初めに渡された引数をチェックするので、何かが間違っているときにエラーコードを返します(例えば、NULLポインタ)。Pythonでエラーが発生するのはいつですか?

QueueオブジェクトがNoneであるか間違った型の無効なキューオブジェクトを操作しようとすると、Pythonでは例外が自動的に発生します。

def foo(queue): 
    if issubclass(Queue, arg): 
     raise ... 
    # ... 

またはエラーではなく取り扱う必要があるように、事前にデータ型をチェックすることをお勧めし何かが間違っていたので、呼び出し元の関数のための課題として残され?私は最初のやり方でそれをするように誘惑されますが、それは間違っているかもしれないと感じます。

+1

私は、良い機能とモジュールはすべて、組み込みのエラー処理メソッドを持つべきだと思います。 – ShreyasG

+1

他には何もありませんが、ダックタイピングの重要なポイントは、何かが特定のタイプのサブクラスであることをテストしてはならないことです。何かを何かチェックする必要がある場合は、呼び出す必要のある属性やメソッドがあるかどうかをチェックします。 –

+1

私は初期の失敗はどんな言語でも良いことだと思います。 – khelwood

答えて

1

どちらの方法を選択するかは状況によって異なり、「デザイン契約」のように、いわゆる契約の一部である必要があります。

上記の設計手法では、関数がその契約を満たしているというメタファーを使用しています。呼び出し元が特定の引数を渡すと、その関数はその契約で指定されているものを実行して返すことを義務付けられています。

呼び出し元が契約に従って値を渡さない場合、呼び出し元が予期しない値を返すか、何らかの方法で失敗することは関数のfaultではありません(もちろん、問題を隠さないでください)。

ソフトウェアの作成時に、タスクの1つは適切な「契約」を選択することです。あなたの質問に対応する2つのアプローチは、要約することができます:

1)契約は言う:あなたのベストを尽くしてください。これは通常の方法です。この機能は、事前に計画されていないケースでも使用できるため、小さく、速く、より一般的です。 Pythonのダックタイピングを最大限に活用しています。

2)契約によれば、リスクを冒さず、守り、入力を検証するなどの理由があります。

優れたコーディングの仕方は、関数の契約を知り、それに応じてコード化し、それに応じて(少なくとも)ドキュメントストリングを記述することです。

契約の知識があれば、良いプログラミング作業を済ませることができます。 (これは可能な "改善"について心配しないでください)

関連する問題