使用match case时出现语法错误:SyntaxError: invalid syntax

38

我一直在尝试使用匹配语句而不是一百万个if语句,但是任何我尝试的都会返回错误:

    match http_code:
          ^
SyntaxError: invalid syntax

我还尝试了一些我找到的测试例子,它们也返回同样的错误,包括这个:

http_code = "418"

match http_code:
    case "200":
        print("OK")

    case "404":
        print("Not Found")

    case "418":
        print("I'm a teapot")

    case _:
        print("Code not found")

我知道匹配模式在Python中是相当新的东西,但我正在使用3.10版本,所以我不确定为什么它们总是返回这个错误。


5
要么你并没有真正使用3.10版本,要么在前面的代码行存在问题。 - chepner
你能在代码中使用print(sys.version)来交叉检查Python版本吗? - Anand Tripathi
3
您在此发布的代码在Python 3.10版本中打印出“我是茶壶”。 - chepner
只是为了让它非常清楚:“9.7” < “10.0”。Anaconda目前还没有默认使用3.10版本。 - Reddspark
我在Python 3.9.5上遇到了同样的错误。match-case 在Python的后续版本中已被弃用吗? - Jiwon
1
@Jiwon 你说的废弃指什么?这个功能只在Python 3.10中引入,所以在3.9中肯定会出错... - Tomerikoo
1个回答

30

match/case语法,也被称为结构模式匹配,仅在Python 3.10版本中引入。请注意,遵循标准惯例,.后面的数字不是十进制,而是版本号的一个单独的“部分”。Python 3.9(以及3.8、3.7等)在Python 3.10之前,不支持该语法。Python 3.11(及更高版本)支持该语法。

虽然可能会出现在先前行上的语法错误直到使用match关键字才被发现,但这种类型的语法错误更多地表明Python版本至少不是3.10

如果Python版本过低而不支持match/case,则此代码将失败并出现断言错误:

import sys
assert sys.version_info >= (3, 10)

或者在命令行中检查版本,通过传递-V--version给Python。例如,在一个系统中,python指的是3.8安装(在那里它不起作用):

$ python --version
Python 3.8.10
$ python
Python 3.8.10 (default, Nov 14 2022, 12:59:47) 
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

如需更多详细信息,请参见如何检查正在运行脚本的Python版本?我安装了哪个版本的Python?

如果您正在尝试使用虚拟环境,请确保已激活它(Linux/Mac howtoWindows (CMD) howtoWindows (Powershell) howto使用PyCharm)。

在3.10中,该代码可以正常工作:

Python 3.10.0 (tags/v3.10.0:b494f59, Oct  4 2021, 19:00:18) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> http_code = "418"
>>> match http_code:
...     case "200":
...         print("OK")
...     case "404":
...         print("Not Found")
...     case "418":
...         print("I'm a teapot")
...     case _:
...         print("Code not found")
   
Out[1]: "I'm a teapot"

在我的情况下发生了这种情况:我在虚拟环境中使用的是Python 3.8,但在我的Docker项目中,我使用的是python:3.8-slim,因此Docker无法成功编译它,因为它没有使用Python3.10。一旦我更改了镜像,问题就得到解决。希望这可以帮助到您。 - Yalchin Mammadli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接