为了账号安全,请及时绑定邮箱和手机立即绑定

避免多个 IF 以确保 McCabe 复杂性

避免多个 IF 以确保 McCabe 复杂性

萧十郎 2021-07-15 18:15:06
我想问你对以下场景的不同观点:假设我们有几个列表,应该为那些非空的列表执行一些操作:if l1 or l2 or l3 or l4 or l5 or l6 or l7 or l8 or l9:    print 'we have to do something in one or more lists'    if l1:        print 'l1'        f1()    if l2:        print 'l2'        f2()    if l3:        print 'l3'        f3()    if l4:        print 'l4'        f4()    if l5:        print 'l5'        f5()    if l6:        print 'l6'        f6()    if l7:        print 'l7'        f7()    if l8:        print 'l8'        f8()    if l9:        print 'l9'        f9()代码本身简单易懂,但这会为 McCabe 复杂性抛出 (12) 值。要降低此值,您将如何处理它?我很开放,很想听听你的想法。
查看完整描述

2 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

如果将所有列表放在列表列表中:


lol = [l1,l2,l3,l4,l5,l6,l7,l8,l9]

然后您可以遍历列表列表:


for l in lol:

    if l:

        # do something


查看完整回答
反对 回复 2021-07-21
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

使用列表列表和函数列表


def f1(l1):

   # do whatever is required to the  l1 list


def f2(l2):

   # similarly


# and similarly for f3 .. f9


...


lofl = [ l1, l2, l3, l4, l5, l6, l7, l8, l9 ]

loff = [ f1, f2, f3, f4, f5, f6, f7, f8, f9 ]


for f, l in zip( loff, lofl):

    if l:  # if the functions f cannot themselves safely do nothing for a falsy argument

        f( l) 

希望所需的函数数量略小于九(在本例中)。您还可以轻松地向函数传递一个参数,因此函数可以是通用的,并告诉它在调用时要执行的变体操作


for f, l, p in zip( loff, lofl, lofp): # or, zip( loff, lofl, list(range(9)) )

    f(l, p)

或者实际上,甚至将任意一组关键字参数传递给函数


lofargs=[ { 'foo':1, 'bar':'Monty' }, # kwargs for f1

          { 'foo':2, 'bar':'Python'}, 

          { 'foo':3 }, 

          {},                     # no kwargs at all for f4, 

          ...

        ]



for f, l, k in zip( loff, lofl, lofargs):

    f( l, **k )


查看完整回答
反对 回复 2021-07-21
  • 2 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信