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.

Était-ce utile?

La 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.

Autres conseils

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top