【问题标题】:Using dictionaries for conditional execution instead of if..elif [closed]使用字典进行条件执行而不是 if..elif [关闭]
【发布时间】:2014-02-20 17:21:58
【问题描述】:

假设你有类似下面的东西:

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

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

【问题讨论】:

  • 基本上是codereview吧?
  • 有点,我一直在考虑如何在不使用条件的情况下实现分支,并一直在玩上面的问题,想知道在哪些情况下它会无效

标签: python if-statement data-structures dictionary


【解决方案1】:

你可以这样做:

v.get(value, case_generic)()

【讨论】:

  • 所有 3 个答案都很好,但这一个以其简单性和避免使用异常或 lamda 赢得了胜利
【解决方案2】:

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

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

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

【讨论】:

  • 好的背景点
【解决方案3】:

使用这种方法我没有发现任何问题,但是可以通过使用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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    相关资源
    最近更新 更多