我试图制作一些我急忙写的代码,其中有很多复制/粘贴更清洁。我注意到我有两个功能,它们在做同样的事情时非常接近。以下是他们的要点:
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
问题是我不认为将条件检查存储在这样的列表中是可能的!如果有人可以向我展示一种方式,或者看到将这些相似类型的功能合并为一种方法的替代方法,请在此处发布
答案 0 :(得分:2)
您可以将条件存储为lambda表达式数组,例如:
a = lambda x: x > 1
b = lambda x: x < 5
conditions = [a, b]
但说实话,我不会。在你的第一个例子中,这两个函数绝对没有错 - 它们有合理的名称,我可以清楚地告诉他们什么时候阅读它们。
如果您重构代码以使用第二个示例,则会丢失此代码。每当我看到对determine_condition
的调用时,我都必须去阅读该函数的功能,并确定它只是检查一系列条件的通用方法。
有时候在可读性的祭坛上牺牲简洁会更好,而对我而言,这是其中一次。
修改强>
我给出的lambda示例并没有返回布尔值,这是你需要的 - 修改后他们做了