Python - Switch/Case 使用字典意味着每个案例的解释

Python - Switch/Case using a Dictionnary implies the interpretation of each case

为了使用 dictionary 模拟 switch/case 块,我注意到一些不应该发生的事情:

print {
    'a': 1,
    'b': 2 + '',
    'c': 3,
}['a']

我希望如此,因为给定的键是 'a' => 第二行(键 b)不应被解释。

但我得到的是:

'b': 2 + '',
TypeError: unsupported operand type(s) for +: 'int' and 'str'

这意味着第二行无论如何都被解释了。

有人对这种现象有解释吗?
或者另一种模拟开关的方法,而不暗示 python 解释每个 case?

虽然您可能试图模仿 switch 语句,但这不是 switch 语句。在您的代码中,整个字典是在您选择键 'a' 处的值之前创建的。所以,如果字典中的任何地方有错误,你就会得到一个错误,在它到达选择 'a'.

之前

这是在 Python 中模拟 switch 的好方法:

choice = 'a'  # From user input or somewhere else

if choice == 'a':
    result = 1
elif choice == 'b':
    result = 2 + ''  # I kept the error for demonstration
elif choice == 'c':
    result = 3

print result

这将打印 1 而不执行其他块,包括有错误的块。

您也可以直接在 if/elif 块中直接 print,而无需先分配给变量。

字典是一个值;它的文字将评估所有子表达式以构建字典。因此,{ 'a': 1, 'b': 2 + '', 'c': 3 } 中的所有内容都在 ['a'] 可以对其调用之前进行评估,然后 print 才能将其作为参数。字典不是执行流控制机制,不能像布尔运算符那样快捷,ifswitch 可以。

在你从匿名字典中获取密钥 a 之前,字典已经初始化。当它初始化时,你会得到上面的 TypeError。

Python 不使用惰性求值,因此它必须先创建整个字典,然后才能使用 ['a'] 访问其中的元素。如果字典创建的任何部分出现错误,您将在该部分失败。

如果你想模拟switch/case,包括它不执行未选择案例的主体,你可以将函数放入字典。

print {
    'a': lambda: 1,
    'b': lambda: 2 + '',
    'c': lambda: 3
}['a']()

有关这方面的更多信息,请参阅

Why Doesn't Python Have Switch/Case?