我在过去看到过一些有趣的switch/case语句的dicts实现,这让我得出了这个答案。使用您提供的示例,您将得到以下结果。(使用complete_sentences_for_function_names非常疯狂,因此check_all_conditions被重命名为status。参见(1))
def status(k = 'a', s = {'a':'b','b':'c','c':'d','d':None}) :
select = lambda next, test : test if test else next
d = {'a': lambda : select(s['a'], check_size() ),
'b': lambda : select(s['b'], check_color() ),
'c': lambda : select(s['c'], check_tone() ),
'd': lambda : select(s['d'], check_flavor())}
while k in d : k = d[k]()
return k
select函数消除了两次调用每个check_FUNCTION的需要,即通过添加另一个函数层,如果check_FUNCTION() else,则避免check_FUNCTION()。这对于长时间运行的函数很有用。dict中的lambdas将其值的执行延迟到while循环。
作为奖励,您可以修改执行顺序,甚至通过更改k和s跳过一些测试,例如k='c',s={'c':'b','b':None}减少测试的数量并反转原始的处理顺序。
那些花时间的人可能会为在堆栈中增加一两个额外层的成本和字典查找的成本而讨价还价,但你似乎更关心代码的美观。
另一种更简单的实现方式可能是:
def status(k=check_size) :
select = lambda next, test : test if test else next
d = {check_size : lambda : select(check_color, check_size() ),
check_color : lambda : select(check_tone, check_color() ),
check_tone : lambda : select(check_flavor, check_tone() ),
check_flavor: lambda : select(None, check_flavor())}
while k in d : k = d[k]()
return k
我指的不是pep8,而是用一个简明的描述性词语来代替句子。当然OP可能会遵循一些编码惯例,使用一些现有的代码库,或者不关心代码库中的简洁术语。