2011-07-05 10 views
25

最近、初期化されていない可能性のある変数について小さなチェックを実装する必要がありました(デフォルト値はNone)。 - これはそれを行うには良い方法です変数のいずれかがNoneに設定されていることを確認してください。

if None in (var1, var2, var3): 
    error_out() 

一方では、私の目には、美しいを境に、私が思っていた:私はこの思い付きましたか?これはの方法ですか?これにより予期しない結果が生じる場合がありますか?最初

+2

私によく見えます。 –

+2

私はそれが完全に大丈夫だと思う。 – Tadeck

+1

'var1 =(None、)'のような愚かなコーナーケースは気にしないので、初期化されていない場合は全く問題ありません。 – smci

答えて

10

まず物事:あなたのコードは、有効な読みやすい、簡潔です...ので、それは(イディオムは、時間と新しい言語機能を進化)それを行うにはな方法ではないかもしれませんが、それは確かにの一つですpythonicの方法でそれを行う方法。

第二に、ちょうど2つの観測:

pythonでエラーを生成するための標準的な方法はraise Exceptionsにあります。関数内で例外を発生させることはもちろん可能ですが、かなり珍しいことですが、何らかの理由でこのデザインを選択したかどうかは不思議でした。あなた自身のExceptionクラスを書くことができるので、エラーメッセージをファイルに記録するような定型コードでも、ラップ関数ではなくクラス自体の中に入る可能性があります。

あなたのテストを書いた方法は、あなたの変数に値としてNoneを割り当てることはできません。これは今問題ではないかもしれませんが、将来の柔軟性を制限するかもしれません。

try: 
    self.variable_name 
except NameError: 
    # here the code that runs if the variable hasn't been initialised 
finally: 
    # [optional] here the code that should run in either case 
+0

実際には、最終的な実装では例外が発生しますが、洞察に満ちた答えと観測に感謝します。 – maligree

7

Aそれを行うにはわずかに異なる方法がに次のようになります。初期化をチェックする別の方法は、単純にない問題の変数の初期値を宣言し、その後の線に沿って何かをすることができthe built-in all methodを使用してください。しかし、これはまた、あなたが望むものではないかもしれない0または""のような偽っぽい値を、キャッチします:

>>> all([1, 2, 3]) 
True 
>>> all([None, 1, 2]) 
False 
>>> all([0, 1]) 
False 
+1

OPが要求したことはありません。 、なしはありません。 – smci

+0

OPが求めているものではないかもしれませんが、これは事実、特定のユースケースに合った答えよりもさらに適切に適合しています! – Angad

3

は私がここに私の2セントを残すために許可:

>>> any(a is None for a in [1,0]) 
False 
>>> any(a is None for a in [1,0, None]) 
True 

だから、1のことができます。

def checkNone(*args): 
    if any(arg is None for arg in args): 
     error_out() 

ここに新しいものはありません。ちょうどIMHOの部分かもしれないany arg is Noneはより可読です

関連する問題