在Python-dictionary中选择不同的开关大小写替换,或者选择elif-else?

2024-03-29 07:31:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近读了一些问题,建议不要在支持switch case语句的语言中使用switch case语句。就Python而言,我已经看到了许多交换机案例的替换,例如:

  1. 使用字典(许多变体)
  2. 使用元组
  3. 使用函数装饰符(http://code.activestate.com/recipes/440499/
  4. 使用多态性(推荐的方法而不是类型检查对象)
  5. 使用if elif else梯子
  6. 有人甚至推荐了访问者模式(可能是外部的)

考虑到各种各样的选项,我在决定如何处理一段特定的代码时遇到了一些困难。我想学习选择其中一种方法的标准。此外,我希望能得到一些建议,在我难以决定的具体情况下(对选择的解释)该怎么做。

具体问题如下:
(一)

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时隙调用,以响应从菜单中选择绘制曲线。一旦应用完成,上述方法将包含总共4-7条曲线。在这种情况下使用一本扔掉的字典是合理的吗?既然最明显的方法是如果艾利夫不这样做,我应该坚持吗?我也考虑在这里使用**卡丁车(在朋友的帮助下),因为所有的曲线类都使用**卡丁车。。。

(2)
第二段代码是当用户更改曲线的属性时调用的qt槽。基本上,slot从gui(spinBox)获取数据,并将其放入适当的curve类的实例变量中。在这种情况下,我又有一个同样的问题-我应该用口述吗?

这是前面提到的插槽-

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箱或更多?每次调用函数时,继续构建并丢弃字典是一个好主意吗?如果我在一个函数之外为此目的构建一个dict,我应该检查它是否需要其他地方吗?如果其他地方不需要,会发生什么?

我的问题是,如果有的话,最好的做法是什么?什么是处理事情最好/最优雅的方法?换句话说,如果elif else,何时使用其他选项?


Tags: 方法代码nameselfif字典valuedef
3条回答

在第一个例子中,我肯定会坚持if-else语句。事实上我没有理由不使用if-else除非

  1. 您发现(使用profile模块)if语句是一个瓶颈(除非您有大量的情况下几乎没有效果),否则IMO是不太可能的。

  2. 使用字典的代码更清晰/重复性更少。

你的第二个例子我会重写

setattr(self, name, value)

(可能添加assert语句来捕获无效的名称)。

叹息。对问题的错误部分过分紧张。switch语句不是问题所在。有很多表达“另类”的方法,但没有添加含义。

问题是意思是--不是技术声明的选择。

有三种常见的模式。

  • 将键映射到对象。如果字典几乎完全是静态的,并且在一个简单的键和另一个更复杂的键之间有映射,请使用字典。每次你需要的时候都在忙着编字典是愚蠢的。如果这是您的意思,您可以使用它:您的“条件”是映射到对象的简单静态键值。

  • 子类之间的变体行为。使用多态性而不是类型检查对象。对的。如果在多个具有不同行为的类中有相似的对象,则它们应该是多态的。尽可能经常使用这个。

  • 其他变体行为。使用if elif else梯子。当您没有基本的静态键到值映射时,请使用此选项。当条件复杂时,或者您的平均值过程,而不是对象时,请使用此选项。

其他的一切都是复杂的代码,可以达到类似的效果。

使用元组。这只是没有映射的字典。这需要搜索,应尽可能避免搜索。别这样,效率很低。使用字典。

使用函数装饰符(http://code.activestate.com/recipes/440499/)。恶心。这隐藏了你正在解决的问题的本质。不要这样做,这并不明显,选择是排他。用别的什么。

有人甚至推荐了访客模式。如果对象遵循组合设计模式,请使用此选项。这取决于多态性的工作,所以这并不是一个真正不同的解决方案。

考虑到这是响应用户操作(从菜单中选择某些内容)而完成的,而且您预期的选择数量非常少,我肯定会使用一个简单的if elif else梯形图。

选择速度是没有意义的,因为它只发生在用户可以选择的最快速度,这不是“光线跟踪器的内环”区域。当然,给用户快速的反馈是很重要的,但是由于案例数量太少,也没有这种危险。

优化简洁性是没有意义的,因为(imo更清晰,零可读性开销)if梯形图无论如何都会很短。

相关问题 更多 >