我最近阅读了建议不要在支持它的语言中使用 switch-case 语句的问题。就 Python 而言,我已经看到了许多 switch case 替换,例如:
- 使用字典(许多变体)
- 使用元组
- 使用函数装饰器(http://code.activestate.com/recipes/440499/)
- 使用多态(推荐方法而不是类型检查对象)
- 使用 if-elif-else 阶梯
- 甚至有人推荐了访客模式(可能是外部的)
鉴于有多种选择,我在决定对特定代码段执行什么操作时有些困难。我想了解在一般情况下选择其中一种方法而不是另一种方法的标准。此外,如果我无法做出决定(附上选择的解释),我将不胜感激有关在特定情况下该怎么做的建议。
这是具体问题:
(1)
def _setCurrentCurve(self, curve):
if curve == "sine":
self.currentCurve = SineCurve(startAngle = 0, endAngle = 14,
lineColor = (0.0, 0.0, 0.0), expansionFactor = 1,
centerPos = (0.0, 0.0))
elif curve == "quadratic":
self.currentCurve = QuadraticCurve(lineColor = (0.0, 0.0, 0.0))
此方法由qt-slot调用,以响应选择从菜单中绘制曲线。一旦申请完成,上述方法将包含总共 4-7 条曲线。在这种情况下使用一次性字典是否合理?由于最明显的方法是 if-elif-else,我应该坚持吗?我还考虑在这里使用 **kargs(在朋友的帮助下),因为所有曲线类都使用 **kargs...
(2)
第二段代码是一个qt-slot,当用户更改曲线的属性时会调用它。基本上,插槽从 gui (spinBox) 中获取数据并将其放入适当曲线类的实例变量中。在这种情况下,我又遇到了同样的问题——我应该使用字典吗?
这是前面提到的插槽-
def propertyChanged(self, name, value):
"""A Qt slot, to react to changes of SineCurve's properties."""
if name == "amplitude":
self.amplitude = value
elif name == "expansionFactor":
self.expansionFactor = value
elif name == "startAngle":
self.startAngle = value
elif name == "endAngle":
self.endAngle = value
作为参考,这里是连接到上述插槽的代码 -
def _connectToPage(self, page):
for connectionData in page.getConnectibles():
self.connect(connectionData["object"],
SIGNAL(connectionData["signal"]),
lambda value, name = connectionData["property"]:\
self.currentCurve.propertyChanged(name, value))
self.connect(connectionData["object"],
SIGNAL(connectionData["signal"]),
self.hackedDisplayArea.update)
注意- self.endAngle 等在构造函数中初始化。
据我所知,选择 dict 的原因是为了快速查找。什么时候有保证?当我有 100 个或更多案例时?每次调用函数时继续构建和丢弃字典是个好主意吗?如果我在函数之外为此目的构建一个字典,我应该检查是否在其他地方需要它?如果其他地方不需要它会发生什么?
我的问题是如果有最好的做法是什么?做事最好/最优雅的方式是什么?换句话说,何时使用if-elif-else,何时使用其他选项?