Whether or not one should write 'if x' or 'if x != 0' [typo corrected]
depends on whether one means the general 'if x is any non-null object
for which bool(x) == True' or the specific 'if x is anything other than
numeric zero'. Â The two are not equivalent. Â Ditto for the length
example.
Can you think of any use cases for the former? And I mean something
where it can't be boiled down to a simple explicit test for the sorts of
arguments you're expecting; something that really takes advantage of the
"all objects are either true or false" paradigm.
But why do you need the explicit test? What benefit do you get from
if len(alist) != 0
instead of the simpler and faster "if alist" ? If you need to know that
alist is actually a list, isinstance() is the function you want; and if
you want to know that it has a length, hasattr(alist, '__len__') is
better. (Or call len() in a try...except block.) Either way, testing the
length is zero explicitly gains you nothing, and risks failure for any
sequence types that might distinguish between an empty sequence and a
length of zero.
The best thing I can come up with out of my mind is cases where you want
to check for zero or an empty sequence, and you want to accept None as
an alternative negative as well. But that's pretty weak.
You might find it pretty weak, but I find it a wonderful, powerful
feature.
I recently wrote a method that sequentially calls one function after
another with the same argument, looking for the first function that
claims a match by returning a non-false result. It looked something like
this:
def match(arg, *functions):
for func in functions:
if func(arg):
return func
I wanted the function itself, not the result of calling the function. I
didn't care what the result was, only that it was something (indicates a
match) or nothing (no match). In one application, the functions might
return integers or floats; in another they might return strings. In a
third, they might return re match objects or None. I don't need to care,
because my code doesn't make any assumptions about the type of the result.