For newer python people, they see return a or b and typically think it returns a boolean if either is True. Nope. Returns a if a is truthy and then checks if b is truthy. If neither are truthy, it returns b.
Returns a if a is truthy and then checks if b is truthy. If neither are truthy, it returns b.
Not quite. If a is not truthy, then the expression a or b will always return b.
So, there is never any reason to check the truthiness of b.
you can paste this in your repl to confirm it does not.
classC:
def__repr__(self): return [k for k, v inglobals().items() if v is self][0]
def__bool__(self):
print(f"{self}.__bool__() was called")
returnFalse
a, b = C(), C()
print(f"result: {a or b}")
Python:
return a or bi like it because it reads like a sentence so it somewhat makes sense
and you can make it more comprehensive if you want to:
return a if a is not None else bThis diverges from the OP code snippets if a has the value
False.I personally dislike this because when you read “or” you expect some boolean result not a random object :/
there’s always the second option for you
For newer python people, they see return a or b and typically think it returns a boolean if either is True. Nope. Returns a if a is truthy and then checks if b is truthy. If neither are truthy, it returns b.
Not quite. If
ais not truthy, then the expressiona or bwill always returnb.So, there is never any reason to check the truthiness of
b.you can paste this in your repl to confirm it does not.
class C: def __repr__(self): return [k for k, v in globals().items() if v is self][0] def __bool__(self): print(f"{self}.__bool__() was called") return False a, b = C(), C() print(f"result: {a or b}")output
a.__bool__() was called result: bAh, good catch.