【问题标题】:What's an alternative to if/elif statements in Python? [duplicate]Python 中 if/elif 语句的替代方法是什么? [复制]
【发布时间】:2013-07-26 17:26:34
【问题描述】:

我的代码目前看起来像这样:

if option1:
    ...
elif option2:
    ...
elif option3:
    ....

以此类推。虽然我对此并不不满,但我想知道在 python 中是否有更好的选择。我的脚本是一个基于控制台的脚本,我使用 argparser 来获取用户需要的内容。

【问题讨论】:

  • 告诉我们更多你想要做什么;例如,您可以使用映射来模型调度。
  • 相关阅读:effbot.org/pyfaq/…
  • 如果表达式 (optionN) 是常量,你可以试试 dict :)
  • @MartijnPieters 我用它来确定用户选择了哪些参数。
  • 如果解析命令行使用内置 python 库,例如argparse,也阅读他们的代码

标签: python


【解决方案1】:

如果“选项”可以包含“一”、“二”或“三”,您可以这样做

def handle_one():
  do_stuff

def handle_two():
  do_stuff

def handle_three():
  do_stuff


{'one': handle_one, 
 'two': handle_two, 
 'three': handle_three}[option]()

【讨论】:

  • 最好添加一个默认值,如I suggested here
  • 嗯,这将取决于默认选项是否可能/有意义
  • 如果 None 作为输入传递怎么办?
  • @dkrynicki 如果您需要处理未知数,您可以使用 .get(option, some_default_function) 而不是 [option] - 这取决于用例,它可能会隐藏错误
【解决方案2】:

我猜您是在其他地方开始编写具有背景的 Python 脚本,switch 语句可以解决您的问题。由于这不是 Python 中的一个选项,因此您正在寻找另一种方式来做事。

但是,如果没有上下文,您就不能很好地回答这个问题(有太多的选择)。

我将提供一个(有点 Python 风格的)替代方案:

让我们从一个我认为你来自哪里的例子开始。

def add_to_x (x):
    if x == 3:
        x += 2
    elif x == 4:
        x += 4
    elif x == 5:
        x += 5
    return x

这是我的替代方案:

def add_to_x (x):
    vals = { 3 : 5  ,  4 : 8  ,  5 : 10 }
    return vals[x]

您也可以将look into lambdas 放入the dictionary structure I used

但是,如上所述,如果没有上下文,这可能不是您要寻找的。​​p>

【讨论】:

  • 似乎字典占了上风。每个人似乎都在暗示这一点。
  • 这当然是一种方法。非常 Pythonic。
【解决方案3】:

这是我想到的第一件事:

不要这样做:

if option1:
    a = 1
elif oprtion2:
    a = 2
elif oprtion3:
    a = 3
else:
    a = 0

你可以这样做:

a = 1 if option1 else 2 if option 2 else 3 if option3 else 0

更多详情请见:PEP 308: Conditional Expressions!

【讨论】: