Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to avoid defensive if conditions in python?

I am writing a code which tries to dig deep into the input object and find out a value lying inside that object. Here is a sample code:

def GetThatValue(inObj):
    if inObj:
       level1 = inObj.GetBelowObject()
       if level1:
           level2 = level1.GetBelowObject()
           if level2:
               level3 = level2.GetBelowObject()
               if level3:
                  return level3.GetBelowObject()
    return None

There are many situations where I end up with these "slanted if conditions". How can I avoid this? This looks dirty and also it is kind of defensive programming.

like image 223
Sadanand Upase Avatar asked Dec 11 '22 07:12

Sadanand Upase


2 Answers

Using for loop:

def GetThatValue(inObj):
    for i in range(4):
        if not inObj:
            break # OR return None
        inObj = inObj.GetBelowObject()
    return inObj

UPDATE

To avoid deeply nested if statements. Check the exceptional case, and return earlier.

For example, following nested ifs:

if a:
    if b:
        return c
return d

can be transformed to flattened ifs:

if not a:
    return d
if not b:
    return d
return c
like image 111
falsetru Avatar answered Dec 31 '22 04:12

falsetru


try:
    return monkey.TypeWriter().Manufacturer().Shareholders().EthnicDistribution()
except AttributeError:
    return None

Try to get the thing. If it doesn't work, you know one of the levels was missing. This works particularly nicely if those GetBelowObject calls aren't actually all the same method.

like image 43
user2357112 supports Monica Avatar answered Dec 31 '22 04:12

user2357112 supports Monica