If you have an arg whose default is something you’re not supposed to bind as a default value in the function sig (e.g. the result of a function call), make it an Optional, default it to None, and then on the first line just do some_arg = some_arg or interesting_function()
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 b
i 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 b
This 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
In python: Not necessarily.
If you have an arg whose default is something you’re not supposed to bind as a default value in the function sig (e.g. the result of a function call), make it an
Optional
, default it toNone
, and then on the first line just dosome_arg = some_arg or interesting_function()
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
a
is not truthy, then the expressiona or b
will 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: b
Ah, good catch.