代码之家  ›  专栏  ›  技术社区  ›  HarlandMason

循环if-else块的备选方案

  •  0
  • HarlandMason  · 技术社区  · 8 年前

    我正在尝试将一些我匆忙编写的代码复制/粘贴得更干净一些。我注意到我有两个函数,它们非常接近于做同样的事情。以下是它们的要点:

    def determine_risk(difference):
        if difference > ON_TRACK:
            return 'On Track'
        elif difference < HIGH_RISK:
            return 'High Risk'
        else:
            return 'Low Risk'
    
    def determine_completeness(pct_complete):
        if pct_complete == UNSTARTED:
            return 'Unstarted'
        elif pct_complete > READY:
            return 'Ready'
        else:
            return 'In Process'
    

    我想把它变成一个函数。类似于

    def determine_condition(metric, [list_of_conditions], [list_of_outcomes], fallback)
        for condition, outcome in zip(list_of_conditions, list_of_outomes):
             if metric satisfies condition:
                  return outcome
        return fallback
    

    问题是我认为不可能在这样的列表中存储条件检查!如果有人能告诉我一种方法,或看到将这些类似类型的函数组合成一个函数的替代方法,请在此处发布

    1 回复  |  直到 8 年前
        1
  •  2
  •   Rob Gwynn-Jones    8 年前

    您可以将条件存储为lambda表达式数组,例如:

    a = lambda x: x > 1
    b = lambda x: x < 5
    conditions = [a, b]
    

    但老实说,我不会。在你的第一个例子中,这两个函数绝对没有错——它们有合理的名称,读它们时我可以清楚地知道它们的作用。

    如果您重构代码以使用第二个示例,则会丢失这一点。每当我看到呼叫 determine_condition ,我必须去阅读函数的功能,并找出它只是检查一系列条件的通用方法。

    有时,最好在可读性的祭坛上牺牲简洁,对我来说,这就是其中之一。

    编辑

    我给出的lambda示例没有返回布尔值,这是您所需要的-因此进行了修改