In some cases, not always, functions return something and if an error happens or there was no match, they return None explicit or implicit.
Explicit
None
def foo():
return None
Implicit
None
def foo():
pass
The implicit
None
returns always, if no other
return
-statement was executed.
If you get from a function some type back and you have to check for None, just recognize that
True
,
False
,
None
are singletons and they're unique. If a bad function, not your code, returns sometimes a list with strings, sometimes None and sometimes an empty list, then you have to do two checks.
First you check, if the return type is a
None
.
If this check passes, you check if the list is not empty.
import random
def silly_function():
return_vals = (None, [], ['Hello', 'World'])
return random.choice(return_vals)
# now the tests are more complex, if you
# want to handle the None explicit
return_value = silly_function()
if return_value is None:
print('None')
elif return_value:
print('The list is not empty')
else:
# no None, but a empty list
print('The list is empty')
Sometimes we have to handle this.
A better approach is this:
def find(pattern):
words = ('foo', 'bar', 'baz', 'fizz', 'fuzz')
results = []
for word in words:
if word.startswith(pattern):
results.append(word)
# MATCH
return results
# the return type of results is always a list
# which is good, because lesser cases to check
return_value = find('f')
if return_value:
print(return_value)
else:
print('Sorry, I did not find any matches. The list is empty')
The line
if return_value:
does an implicit bool(return_value).
If the list is empty,
bool(your_list)
returns
False
.
So in general the boolean of sequences and containers is False, if the container or sequence is empty.
Otherwise it's
True
.
True
and
False
are subtypes of
int
.
This expression is True:
(0.0 == 0 == False)
This expression is True:
(1.0 == 1 == True)
Other funny stuff:
(True + True == 2)
Counting True in a list, where only True and False are inside.
true_false_list = [True, False, True, True, False, True]
# sum True
trues = sum(true_false_list)
print('True is', trues, 'times in the list')
# of course you can use also
# true_false_list.count(True)
All values of integers and floats are evaluated as boolean to True, if the value is not zero.
values = (True, False, None, 0, -1, 1, 10, 0.0, 5.5, -5.5, [], (1,2,3), [1])
# a tuple with some values
for value in values:
print(f'The boolean of the value {value!s:<10} is {bool(value)}')
Output:
The boolean of the value True is True
The boolean of the value False is False
The boolean of the value None is False
The boolean of the value 0 is False
The boolean of the value -1 is True
The boolean of the value 1 is True
The boolean of the value 10 is True
The boolean of the value 0.0 is False
The boolean of the value 5.5 is True
The boolean of the value -5.5 is True
The boolean of the value [] is False
The boolean of the value (1, 2, 3) is True
The boolean of the value [1] is True
With this knowledge you can simplify your code and write it more pythonic.