Recently I've been doing a lot of python scripting. It's a bit of an alien language to me as I'm used to strong types, but maybe not quite as alien as F#! Today I ran into an impossible to find bug. All my return values were as expected, nothing was out of place; yet the test continued to sometimes fail. After borrowing the brain of one of my coworkers I realized what was wrong and I feel very dumb.
Let's look at this code sample:
def compare_function(file1,file2): if file1 is None or file2 is None: raise Exception('file1 anf file2 must not be None') result = execute_util(['compare_images.exe', file1, file2]) if not result: return False else: return float(result.replace("'", '').replace('\n','').strip())
Do you see a possible problem? Lets suppose I try to compare the result of this function with 0.0%, well what's the difference with that and False? I was expecting to return False on error or return a floating point value if it were successful, but it would be possible to return 0.0 on success. I should have realized this with enough C/C++ experience, but now I feel like such a beginner again. The solution was to return None on error instead of False.