# Python carefully avoids evaluating bools more than once in a variety of situations. # Eg: # In the statement # if a or b: # it doesn't simply compute (a or b) and then evaluate the result to decide whether to # jump. If a is true it jumps directly to the body of the if statement. # We can confirm that this behaviour is correct in python code. # A Bool that raises an exception if evaluated twice! class ExplodingBool(): def __init__(self, value): self.value = value self.booled = False def __bool__(self): assert not self.booled self.booled = True return self.value y = (ExplodingBool(False) and False and True and False) print(y) if (ExplodingBool(True) or False or True or False): pass assert ExplodingBool(True) or False while ExplodingBool(False) and False: pass # if ExplodingBool(False) and False and True and False: # pass