2016-07-21 6 views
5

小さなテストフレームワークのために私はいくつかのユーティリティ関数を提供しようとしています。`if x:`は `bool(x)が真ならば:`と完全に等価です: `?

そのうちの一つは、if x:と同等であると考えられるが、それはif bool(x) is True:完全 equivallentであるならば、私はif x is True:if x:を確認する1つの機能を提供することができます。

否定も同等ですか? if bool(x) is False:if not x:に等しいか?

+6

注意してください。 'xが真であれば'は 'bool(x)が真であれば'と同じではない。 –

+0

@JohnKugelmanそれを拡張するケア?いつ彼らは同等ではないでしょうか? – RedX

+3

'x = True'は' x = True'ならtrueですが 'bool(x)がTrueならば' 'x = 1'や' x = '' 'や' x = [1、 2] 'など –

答えて

6

if x:は、完全にブール値の真偽値testと同等です。 if statement documentationから

それは

(真と偽の定義のためのセクション Boolean operationsを参照してください)正確に一つが真であることが判明するまで表現一つ一つを評価することにより、スイートのいずれかを選択

ここで、Boolean operations sectionはどのように真実が定義されていますか。 bool() functionは、まったく同じ規則に従います。

ブール値、つまり真または偽のいずれかを返します。 xは、標準の真理試験手順を使用して変換されます。

標準的なタイプのドキュメントは、Truth Value Testing sectionを有する:

任意のオブジェクトは、if又はwhile状態で使用するための以下のブール演算のオペランドとして、真理値について試験することができます。

notは、同じ真理値を単純に反転します。したがって、上記の規則によってxが真と見なされる場合、not xFalseを返し、それ以外の場合はTrueを返します。

ように注意してください:グローバルを設定することにより、マスクされすることができ、組み込みの名前FalseTrue、Pythonの2に:

>>> True = False 
>>> True 
False 

ので、isアイデンティティのテストとしてその再割り当てによってだまされますよくPython 3は、FalseTrueというキーワードになります。

あなたのユーティリティ関数は、bool(x) is Trueまたはbool(x) is Falseを使用する必要はありません。必要なのは、bool(x)not bool(x)です。これらは、がすでにで、TrueFalseというオブジェクトを生成しています。 bool()notは何も返すことができません。is Trueまたはis Falseを使用すると非常に冗長です。

最後に、テストホイールを再発明しないようにしてください。Python標準ライブラリにはunittestライブラリが付属しています。 assertTrueassertFalseの両方の機能を持ち、implementation of these functionsifif notの両方を使用しています。

2

はい。これらは同等です。 ifによって使用される規則は、boolによって使用される規則と同じです。 notは、真実性または虚偽を判断するロジックを変更することなく、これらの値を単純に逆転させます。

1

@Martijnの回答に加えて、あなたが構築しているものが何らかのクラスであれば、ìf xのような真実テストのケースでどのような振る舞いを持つかを定義することができ、__bool__関数を定義します。

>>> class A: 
     pass 

>>> a=A() 
>>> if a: 
     print("this instance class is truthish") 

this instance class is truthish 
>>> a is True 
False 
>>> bool(a) is True 
True 
>>> 

ユーザー定義のクラスのデフォルトの動作は、常にちょうど(のpython 2で__nonzero____bool__を定義することを変更するには、真実のテストで真であることがあるので、それはのためのように、クラスの意味に応じて調整例:

>>> class Switch: 
     def __init__(self, state="off"): 
      self.state = state 
     def __bool__(self): 
      if self.state == "on": 
       return True 
      return False 


>>> x=Switch() 
>>> if x: 
     print("this instance class is truthish") 


>>> x is True 
False 
>>> bool(x) is True 
False 
>>> x.state="on" 
>>> if x: 
     print("this instance class is truthish") 

this instance class is truthish 
>>> x is True 
False 
>>> bool(x) is True 
True 
>>> 
関連する問題