我试图替换if/elif/elif//else代码块,使用Python 3.10中较短的match/case
。我定义了三个常量,并想为每个常量做一些不同的事情,所以我的代码大致如下:
>>> const_a = 1
>>> const_b = 2
>>> const_c = 3
>>> interface = const_b # example
>>> match interface:
... case const_a:
... print("case a")
... case const_b:
... print("case b")
... case const_c:
... print("case c")
然而,当运行此代码时,会出现异常:
File "<stdin>", line 2
SyntaxError: name capture 'const_a' makes remaining patterns unreachable
我做错了什么?
match...case
不仅仅是一个switch...case
。从…起https://www.python.org/dev/peps/pep-0622/#patterns:
- capture模式看起来像x,相当于一个相同的赋值目标:它总是匹配并绑定具有给定(简单(名称的变量
- 常量值模式的工作原理与文字类似,但适用于某些命名常量。注意,考虑到捕获模式可能存在歧义,它必须是一个限定的(虚线(名称。它看起来像Color.RED,并且只匹配与相应值相等的值。它从不绑定
因此,您必须创建一个将这些变量作为属性的对象,并在匹配的中使用限定名称
import types
consts = types.SimpleNamespace()
consts.A = 1
consts.B = 2
consts.C = 3
interface = 2
match interface:
case consts.A:
print("A")
case consts.B:
print("B")
case consts.C:
print("C")
如预期,打印B
有关为什么的更多信息,请参阅https://www.python.org/dev/peps/pep-0622/#alternatives-对于常值模式