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
才能将其作为参数。字典不是执行流控制机制,不能像布尔运算符那样快捷,if
和 switch
可以。
在你从匿名字典中获取密钥 a
之前,字典已经初始化。当它初始化时,你会得到上面的 TypeError。
Python 不使用惰性求值,因此它必须先创建整个字典,然后才能使用 ['a']
访问其中的元素。如果字典创建的任何部分出现错误,您将在该部分失败。
如果你想模拟switch/case
,包括它不执行未选择案例的主体,你可以将函数放入字典。
print {
'a': lambda: 1,
'b': lambda: 2 + '',
'c': lambda: 3
}['a']()
有关这方面的更多信息,请参阅
为了使用 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
才能将其作为参数。字典不是执行流控制机制,不能像布尔运算符那样快捷,if
和 switch
可以。
在你从匿名字典中获取密钥 a
之前,字典已经初始化。当它初始化时,你会得到上面的 TypeError。
Python 不使用惰性求值,因此它必须先创建整个字典,然后才能使用 ['a']
访问其中的元素。如果字典创建的任何部分出现错误,您将在该部分失败。
如果你想模拟switch/case
,包括它不执行未选择案例的主体,你可以将函数放入字典。
print {
'a': lambda: 1,
'b': lambda: 2 + '',
'c': lambda: 3
}['a']()
有关这方面的更多信息,请参阅