无法减去大小写模式?

Unable to subtract in case pattern?

我正在尝试在 Python shell:

中使用 Python 3.10 结构模式匹配
match a:
   case (2 - 1):

进入第二行后,出现如下错误:

  File "<stdin>", line 2
    case (2 - 1):
              ^
SyntaxError: imaginary number required in complex literal

注意:我知道在 case 之后没有要执行的代码,我在 shell 中执行此操作,它会立即抛出此错误。
另外,我知道我可以按照 存储它们,但如果有办法,我宁愿直接这样做。

您不能计算模式中的任意表达式。与其他模式语法的冲突空间太大。

例如,将 2 - 1 作为一种模式没有什么意义。如果您有一个值存储在变量 x 中,您可能希望匹配 x - 1:

case x - 1:
    ...

但考虑一下 case x 意味着什么:

case x:
    ...

case x 意思是“匹配任何东西并设置 x 等于匹配的东西”。 case xcase x - 1 做如此截然不同的事情会非常混乱。

您收到的错误消息是因为有一种特殊情况,在模式中允许加法和减法,作为复数“文字”的一部分:

case 1+2j:
    ...

1+2j1-2j 这样的表达式在语法上是加法或减法表达式,而不是单个文字,因此 Python 必须允许这种特定的加法或减法情况才能允许具有复杂常数的常数模式。错误消息来自 Python,期望 - 是复数常量的一部分。

如果要匹配计算值,请使用保护:

case x if x == arbitrary_expression:
    ...

您将 case 之后的模式视为带值的普通表达式,但它实际上是 Python 中的一个全新的语法类别;它看起来像对象构造(即一些文字,或对构造函数的调用),但实际上恰恰相反,模式用于解构您要匹配的对象。

所以,这有效:

match x:
    case 1:
        print('one')

因为文字 1 具体表示 int 的值为 1。但是 (2 - 1) 是由两个字面整数、一个运算符和用于分组的括号组成的表达式。 Python 尝试将其解释为一种模式,而解构复数的模式最接近。

例如:

n = 2 - 1j

match n:
    # these parentheses aren't needed, but allowed; 
    # they're here to show what Python thought you were trying to do
    case (2 - 1j):
        print('this number')
    case complex(real=r, imag=i):
        print('some other complex number')

正如另一个答案中所指出的,如果您需要进一步限制要匹配的值,可以使用守卫:

def try_this(n):
    match n:
        case int(x) if x == (2 - 1):
            print('what I want')
        case int(x):
            print('some other int')


try_this(1)
try_this(2)