2014-02-20 31 views
3

使用字典假设您有类似下面:条件执行,而不是if..elif

def case_A(): 
    print 'A' 

def case_B(): 
    print 'B' 

def case_generic(): 
    print 'some generic case' 

而且value定义,并在其

你看到任何情况下一定值(S)在这里你不会想申请以下模式:

v = {"A":case_A, "B":case_B} 
try: 
    v[value]() 
except: 
    case_generic() 

代替标准:

if value == "A": 
    case_A() 

elif value == "B": 
    case_B() 

...place n more if cases here... 

else: 
    case_generic() 

对我来说,第一个案例看起来更加紧凑和易于管理,尽管内存略有增加。或者,您是否看到了改进上述方法或使用更好方法的方法?

+0

基本上codereview,对不对? – thefourtheye

+0

排序,我一直在考虑如何实现不使用条件分支,并一直在玩弄上面的问题,在哪些情况下它将是无益的 – gts

回答

5

你可以这样做:

v.get(value, case_generic)() 
+0

所有3个答案都很好,但这个答案很简单,避免使用异常或lamda – gts

2

我不使用这种方法发现任何问题,但它可以通过使用defaultdict加以改进:

v = defaultdict(lambda: case_generic) 
v.update({"A": case_A, "B": case_B}) 

v['A']() # 'A' 
v['B']() # 'B' 
v['K']() # 'some generic case' 
2

EAFP(它更容易问因为它强调简洁性和可读性,并且可以产生快速,高效和可读的代码,所以在Python中是一种常见的编码风格。 在其他语言中,使用异常作为控制流而不是真正例外的原因被忽视(参见Joshua Bloch, Effective Java, Item 57)。

但是您不希望有一个通用的except子句,因为这会吞噬可能在执行代码时发生的任何类型的可能异常。相反,你希望在你正在捕捉的异常中非常明确,这使得任何读者都很清楚你正在检查密钥:

try: 
    v[value]() 
except KeyError: # Key doesn't exist in dictionary 
    case_generic() 
+0

良好的背景点 – gts