Python 循环if-else块的备选方案

Python 循环if-else块的备选方案,python,Python,我正在努力使我匆忙编写的一些代码更干净一些,其中包含了大量的复制/粘贴。我注意到我有两个函数,它们非常接近于做同样的事情。以下是它们的要点: def determine_risk(difference): if difference > ON_TRACK: return 'On Track' elif difference < HIGH_RISK: return 'High Risk' else: return

我正在努力使我匆忙编写的一些代码更干净一些,其中包含了大量的复制/粘贴。我注意到我有两个函数,它们非常接近于做同样的事情。以下是它们的要点:

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'

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

a = lambda x: x > 1
b = lambda x: x < 5
conditions = [a, b]
a=lambda x:x>1
b=λx:x<5
条件=[a,b]
但老实说,我不会。在第一个示例中,这两个函数绝对没有问题——它们有合理的名称,我在阅读它们时可以清楚地看出它们的作用

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

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

编辑


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

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

a = lambda x: x > 1
b = lambda x: x < 5
conditions = [a, b]
a=lambda x:x>1
b=λx:x<5
条件=[a,b]
但老实说,我不会。在第一个示例中,这两个函数绝对没有问题——它们有合理的名称,我在阅读它们时可以清楚地看出它们的作用

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

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

编辑


我给出的lambda示例没有返回布尔值,这正是您需要的-修改后,它们会返回布尔值

您的意思是?将您的编码封装在函数中,使用这些函数…您的意思是?将您的编码封装在函数中,使用这些函数…不要将lambda表达式用作一行
def
语句。@chepner这是我能想到的最简单的示例,可以演示OP如何实现他试图实现的目标。我的总体观点是,我认为你不应该做这样的事情:)我认为这是一个很好的答案。“这是你如何做你想做的事情,但这就是为什么你根本不应该这样做”是一个非常常见的回答模式,我不介意在“这是可行的,但不要这样做”代码块中有一些代码可能会在评审中被标记。我同意。学习编写好代码的哲学就像学习简化代码的巧妙技巧一样受欢迎。谢谢@RobGwynn Jones不要将lambda表达式用作一行
def
语句。@chepner这是我能想到的最简单的示例,可以演示OP如何实现他试图实现的目标。我的总体观点是,我认为你不应该做这样的事情:)我认为这是一个很好的答案。“这是你如何做你想做的事情,但这就是为什么你根本不应该这样做”是一个非常常见的回答模式,我不介意在“这是可行的,但不要这样做”代码块中有一些代码可能会在评审中被标记。我同意。学习编写好代码的哲学就像学习简化代码的巧妙技巧一样受欢迎。谢谢你@RobGwynn Jones