Question

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.

Was it helpful?

Solution 2

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.

OTHER TIPS

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top