如何在python中避免防御?

时间:2014-02-24 07:13:01

标签: python defensive-programming

我正在编写一个代码,它试图深入挖掘输入对象并找出该对象内的值。以下是示例代码:

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

在很多情况下,我最终会遇到这些“倾斜的条件”。 我怎么能避免这个?这看起来很脏,也是一种防御性的编程。

2 个答案:

答案 0 :(得分:9)

使用for循环:

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

<强>更新

避免深层嵌套的if语句。检查例外情况,并提前返回。

例如,在嵌套的if之后:

if a:
    if b:
        return c
return d

可以转换为展平if s:

if not a:
    return d
if not b:
    return d
return c

答案 1 :(得分:4)

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

尝试得到这个东西。如果它不起作用,你知道其中一个级别缺失。如果那些GetBelowObject调用实际上并不是完全相同的方法,那么这种方法效果特别好。