2016-07-21 7 views
5

Für ein kleines Test-Framework, das wir schreiben, versuche ich einige Utility-Funktionen zur Verfügung zu stellen.Ist `wenn x:` vollständig äquivalent zu `wenn bool (x) wahr ist:`?

Einer von ihnen soll if x: äquivalent sein, aber wenn das vollständig equivallent zu if bool(x) is True: dann könnte ich bieten nur eine Funktion if x is True: und if x: zu überprüfen.

Ist die Negation auch gleichwertig? if bool(x) is False: gleich if not x:?

+6

Seien Sie vorsichtig. 'wenn x wahr ist' ist nicht dasselbe wie' wenn bool (x) wahr ist'. –

+0

@JohnKugelman Darf's weiter ausgebaut werden? Wann würden sie nicht gleichwertig sein? – RedX

+3

Weil 'wenn x wahr ist' nur wahr ist, wenn' x = Wahr ', aber 'wenn bool (x) wahr ist' ist wahr wenn' x = 1' oder 'x = '' oder' x = [1, 2] 'usw. –

Antwort

6

if x: ist komplett entspricht dem Testen für den booleschen Wahrheitswert, ja.

Vom if statement documentation:

Es genau einer der Suiten wählt durch die Ausdrücke einer Auswertung der von einer bis sein wahr zu finden ist (Abschnitt Boolean operations für die Definition von wahr und falsch sehen)

wo die Boolean operations section Details wie Wahrheit definiert ist. Die bool() function folgt genau den gleichen Regeln:

Geben Sie einen booleschen Wert zurück, d. H. Einen von True oder False. x wird unter Verwendung des Standard-Wahrheitstestverfahrens konvertiert.

Die Standardtypen Dokumentation hat ein Truth Value Testing section:

Jedes Objekt kann für Wahrheitswert getestet werden, für die Verwendung in einem if oder while Zustand oder als Operanden der Booleschen Operationen unten.

not invertiert einfach denselben Wahrheitswert; Wenn also x durch die obigen Regeln als wahr betrachtet wird, gibt not x sonst False und True zurück.

Seien Sie vorsichtig: in Python 2 kann die eingebauten Namen False und True indem maskiert werden, um eine global:

>>> True = False 
>>> True 
False 

und damit is Identitätstests durch diese Neuzuordnung täuschen kann als Gut. Python 3 macht False und True Schlüsselwörter.

Ihre Dienstprogrammfunktion sollte bool(x) is True oder bool(x) is False nicht verwenden müssen. Alles, was Sie brauchen, ist bool(x) und not bool(x), da diese bereits produzieren True und False Objekte. bool() und not können nichts anderes zurückgeben, mit is True oder is False auf diese ist extrem redundant.

Last but not least, versuchen Sie nicht, das Testrad neu zu erfinden.Die Python-Standardbibliothek enthält eine unittest Bibliothek; Es hat sowohl assertTrue und assertFalse Funktionen, und die implementation of these functions verwenden Sie einfach if und if not.

2

Ja. Diese sind gleichwertig. Die von if verwendeten Regeln sind die gleichen wie die von bool verwendeten. not invertiert einfach diese Werte, ohne die Logik zur Bestimmung der Wahrheit oder Falschheit zu ändern.

1

zusätzlich zu der Antwort von @Martijn, wenn das, was Sie bauen, sind einige Klasse, können Sie definieren, welches Verhalten Sie in einem Wahrheitstest Fall wie ìf x haben möchten, indem Sie __bool__ Funktion definieren.

>>> 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 
>>> 

das Standardverhalten für eine Klasse Benutzer definiert ist immer in einer Wahrheitstest wahr zu sein, dass __bool__ (__nonzero__ in Python 2) nur zu ändern, definieren, so dass es entsprechend anpassen, um die Semantik der Klasse, wie für Beispiel:

>>> 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 
>>> 
Verwandte Themen