2016-05-19 3 views
4

私は以下の "assert"を使用して、関数の引数の値を検証しています。 "test"というBoolean型の入力 "arg1"を持つ関数 "None"、TrueまたはFalseがあります。 "arg1"がこれらの可能な値の1つだけであることを確認してもよろしいですか?引数の値が定義された範囲の値の一部であるかどうかを確認する正しい方法ですか?

これを行うことはできません:以下

def test(arg1=None): 
     assert arg1 in set([None, True, False]), "Not a valid input" 
... 

私の友人が私に語りました。 True、False、Noneをアイデンティティ(=ではない)として比較する必要があります。 inを行うことは、multiple =のと等価です。あなたは別のものを維持しなければなりません。

これは間違いありませんか?

+1

はい、そうです。 '1、{True、False、None}'は 'True'を返します。 'any(1は{True、False、None}のoはoです)'は 'False'を返します。 –

答えて

4

フレンドはNoneの場合は正しいです。あなたは、(あなたがほとんどそうではない)ちょうど "無意味"で大丈夫でない限り、常にそれをテストするためにアイデンティティを使うべきです。

TrueまたはFalseについては、正確な値が必要なのか、真実性が必要なのかを調べる必要があります。前者の場合はinを使用してテストすることができますが、後者の場合はブール値のコンテキストで使用するときには全くテストしないで、引数をbool()に渡すだけです。

しかし、あなたの両方を逃しているあなたのコード内の別の問題がある:

アサーションは、意思決定のために使用すべきではありませんが。

アサーションは、入力を検証するだけでなく、システムに悪影響を与える場合に使用します。

+0

あなたはその目的のために契約の使用を提案していますか? – Diego

4

アイデンティティテストが必要な場合は、「is」を使用する必要があります。 "in"は平等テストを使用するので、あなたの友人は正しいです。例:

a = [0, 1] 
False in a 
>> True 
a[0] is False 
>> False 

誰かが0を渡すと、アサーションがトリガーされません。あなたはそれを期待していないかもしれません。

関連する問題