我有一个函数,它有许多嵌套的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语句?
答案 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