我尝试用更短的代码块替换 if/elif/elif/.../else 代码块match/case
从 Python 3.10 开始。
我定义了三个常量,并希望对每个常量执行不同的操作,因此我的代码大致如下所示:
>>> 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
我究竟做错了什么?
The match...case
不仅仅是一个switch...case
. From https://www.python.org/dev/peps/pep-0622/#patterns https://www.python.org/dev/peps/pep-0622/#patterns:
- A capture模式看起来像 x 并且相当于一个相同的赋值目标:它总是匹配并绑定具有给定(简单)名称的变量。
- A 恒定值模式的工作方式与文字类似,但适用于某些命名常量。请注意,考虑到捕获模式可能存在歧义,它必须是限定(点)名称。它看起来像 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
欲了解更多信息why, see https://www.python.org/dev/peps/pep-0622/#alternatives-for-constant-value-pattern https://www.python.org/dev/peps/pep-0622/#alternatives-for-constant-value-pattern
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)