Sadanand Upase
Sadanand Upase

Reputation: 142

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.

Upvotes: 4

Views: 293

Answers (2)

falsetru
falsetru

Reputation: 369294

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

Upvotes: 9

user2357112
user2357112

Reputation: 281528

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.

Upvotes: 4

Related Questions