2011-02-02 8 views
3

成功すればタプルを返しますが、失敗した場合はNoneを返すメソッドを記述しています。私はNone(失敗事例の返品として)でまだファイナライズしていませんが、それは選択肢の1つです。私達は失敗の場合のために-1,-1を返すことができますか?私はこれを達成するための最良のpythonic方法を探していますので、開梱が簡単です。メソッドから返されたタプル

改善の方法を教えてください。擬似コードは以下の通りです

def myFunc(self): 
    if self.validate() != 0: 
     return 
    x,y = self.getXY() 

    return x,y 
+0

なぜですか?例外を発生させると何が問題になるのですか? –

答えて

14

エラーが発生した場合、例外を発生させてください。

もちろん、失敗として(-1、-1)を返すことはできますが、私の意見では良い解決策ではありません。

Python EAFP(許可よりも簡単に尋ねる方が簡単です)がLBYL(Look Before You Leap)よりも好まれていることを覚えておいてください。

これは、すべての作品が適切な例外をキャッチしているという仮説の下でコードを書く方が良いと考えられることを意味します。あなたのコードは、その後

def myFunc(self): 
    if self.validate() != 0: 
     raise CustomNotValidatedException() 
    x,y = self.getXY() 

    return x,y 

になる可能性があり

私は、次の方法でコードを改善する:

  • をするように結果が、肯定的でない場合self.validate()の戻り0を作ります2番目の行をより平凡な方法で変更することができます。

    if not self.validate(): 
    
  • ermediateにreturn文を変更してx, y変数:

    return self.getXY() 
    

は最後に、あなただけのgetXY()内の例外を発生させる可能性があり、あなたのコード内で直接このメソッドを使用します。

+2

+1:奇妙なコード値を返すよりも例外が優れています。 –

+0

あなたは 'validate()'の中で例外を発生させることを意味します、おそらく?私はここで 'getXY()'はパブリックインターフェイスの一部として意図されていないか(すべての命名は奇妙なものです)、実際のコードの代わりにスタブとして意図されています実際にヘルパーにリファクタリングする必要があります:))。 –

+0

いいえ、私は実際に 'getXY()'の中に例外を投げることを意味します。そうしないと、クライアントは 'getXY()'を呼び出す前に 'validate()'を強制的に呼び出さなければなりません。私はクライアントにとって 'getXY()'を呼び出すのは大丈夫だと思いますが、ほぼ疑似コードのためにこの推論を行うのは難しいです。 –

3

これがプログラミングエラーをキャッチする場合、アサートはよりクリーンです。

def my_function(self): 
    assert self.validate() 
    return self.x, self.y 

ユーザー提供のデータで実行時エラーが発生する場合は、例外が発生する可能性があります。

def my_function(self): 
    if not self.validate(): 
     raise ValidationError 
    return self.x, self.y 

ここで良い代替はself.validateのために()検証エラー自体を上げるためになります。これは例を可能にするメッセージを検証エラーの理由を与えて提供されます。

+0

+1:例外は奇妙なコード値を返すよりも優れています。 –

関連する問題