Python 3.10匹配/大小写常量



我试图替换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-对于常值模式

相关内容

  • 没有找到相关文章

最新更新