说你有类似下面的内容:
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()
对我而言,第一种情况看起来更紧凑,易于管理,尽管内存略有增加。或者,您是否看到了改善上述方法或使用更好方法的方法?
答案 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()