使用字典进行条件执行而不是if..elif

时间:2014-02-20 17:21:59

标签: python if-statement data-structures dictionary

说你有类似下面的内容:

def case_A():
   print 'A'

def case_B():
   print 'B'

def case_generic():
   print 'some generic case'

value已定义并且在其中有一些价值

您是否看到任何您不希望应用以下模式的方案:

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()

对我而言,第一种情况看起来更紧凑,易于管理,尽管内存略有增加。或者,您是否看到了改善上述方法或使用更好方法的方法?

3 个答案:

答案 0 :(得分:5)

你可以这样做:

v.get(value, case_generic)()

答案 1 :(得分: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 :(得分:2)

EAFP(请求宽恕比允许更容易)是Python中常见的编码风格,因为它强调简洁性和可读性,并且可以生成快速,高效和可读的代码。 在其他语言中,使用异常作为控制流而不是真正特殊的原因是不受欢迎的(参见Joshua Bloch, Effective Java, Item 57)。

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

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