短路上的python调用函数

时间:2016-05-10 03:35:30

标签: python

我有一个函数,它有许多嵌套的if语句,而sonarqube正在抱怨它。有一系列条件可以发生,我会记录每次发生的时间,返回一个bool和一个int然后增加一个计数器。

def _fix(ids, id, sch_date, cycles, dp):
    try:
        gs = cycles.get(id)
    except AttributeError:
        gs = False

    if id in ids:
        if cycles:
            if gs:
                if sch_date in gs:
                    if dp in gs[sch_date]:
                        return True, None
                    else:
                        self.d_types[4] += 1
                        return False, 4
                else:
                    self.d_types[1] += 1
                    return False, 1
            else:
                self.d_types[3] += 1
                return False, 3
        else:
            self.d_types[2] += 1
            return False, 2
    else:
        return False, None

我以为我可以这样做:

if id in ids and cycles and gs and such_date in gs and dp in gs[sch_date]:
    do something...

然后我不知道它在哪里短路所以我将无法递增计数器或返回必要的int和布尔值。

任何想法如何在保留返回和计数器的同时摆脱所有这些if语句?

1 个答案:

答案 0 :(得分:2)

每个else都可以终止该函数,因此反转测试条件。如果函数已经返回,则不需要else,这大大减少了嵌套代码。

if id not in ids:
    return False, None

if not cycles:
    self.d_types[2] += 1
    return False, 2

if not gs:
    self.d_types[3] += 1
    return False, 3

if sch_date not in gs:
    self.d_types[1] += 1
    return False, 1

if dp not in gs[sch_date]:
    self.d_types[4] += 1
    return False, 4

return True, None