1

我正在尝试在 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 中执行此操作,它会立即引发此错误。
另外,我知道我可以按照这个答案存储它们,但如果有办法,我宁愿直接这样做。

4

2 回答 2

2

不允许在模式中计算任意表达式。与其他模式语法发生冲突的空间太大了。

例如,2 - 1作为一个模式做没有什么意义。如果你有一个值存储在一个变量x中,你可能想要匹配x - 1

case x - 1:
    ...

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

case x:
    ...

case x意思是“匹配任何东西并设置x等于匹配的东西”。case x对于和case x - 1做如此截然不同的事情,这将是非常令人困惑的。

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

case 1+2j:
    ...

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

如果要匹配计算值,请使用警卫:

case x if x == arbitrary_expression:
    ...
于 2022-01-06T01:29:05.513 回答
1

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

所以,这有效:

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

因为字面量1专门表示int值为 的1。But(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)
于 2022-01-06T01:51:02.737 回答