PEP 622 - match 语句可以用作表达式吗?

Abh*_*kar 4 python isinstance python-3.10 structural-pattern-matching

PEP 622引入了match声明作为if-elif-else. 然而,我在提案或任何在线材料中找不到的一件事是该match声明是否可以用作表达式而不仅仅是作为声明。

举几个例子可以清楚地说明这一点:

示例1:

def make_point_2d(pt):
    match pt:
        case (x, y):
            return Point2d(x, y)
        case _:
            raise TypeError("not a point we support")
Run Code Online (Sandbox Code Playgroud)

示例2:

match response.status:
    case 200:
        do_something(response.data)
    case 301 | 302:
        retry(response.location)
Run Code Online (Sandbox Code Playgroud)

在第一个示例中,函数从子句内部返回case,而在第二个示例中,不返回任何内容。但我希望能够做类似以下假设示例的事情:

spouse = match name:
    case "John":
        "Jane"
    case "David":
        "Alice"
print(spouse)
Run Code Online (Sandbox Code Playgroud)

但它无法编译。

Bri*_*ian 6

不可以,match 语句不能用作表达式。

PEP 622 的“被拒绝的想法”部分对此进行了解决:

让它成为一个表达

在大多数其他语言中,模式匹配由表达式而不是语句表示。但将其设为表达式将与 Python 中的其他语法选择不一致。所有决策逻辑几乎都以陈述的形式表达,因此我们决定不偏离这一点。