You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何使用类型别名实现结构化模式匹配?

Python结构化模式匹配与类型别名的问题

可正常运行的简单示例

from linesParser import get_ProcessCell
from typing import List,Tuple,Union

ti=Tuple[int,int]
ua=Union[int,ti]

a=(3,3)
match a:
    case (x,y):
        print("A")
    case _:
        print("B")

复杂类型别名引发的报错

但如果将ti的定义改为包含不同元组的Union类型:

ti=Union[Tuple[int,int],Tuple[int,int,int]]
ua=Union[int,ti]
a=(3,3)
match a:
    case (x,y) | (x2,y2,z2):
        print("A")
    case _:
        print("B")

执行mypy myfile.py会返回如下错误:

tobedeteled.py:9: error: Alternative patterns bind different names

尝试类型检查式写法

我也尝试了以下写法:

from linesParser import get_ProcessCell
from typing import List,Tuple,Union

ti=Union[Tuple[int,int],Tuple[int,int,int]]
ua=Union[int,ti]

a=(3,3)
match a:
    case isinstance(a,ti):
        print("A")
    case _:
        print("B")

得到错误提示:

error: Expected type in class pattern; found "isinstance"

我更倾向于这类方案,因为后续修改ti的定义时,不想改动case语句中的代码。

后续尝试

参考相关教程后,我尝试了如下写法:

from linesParser import get_ProcessCell
from typing import List,Tuple,Union

ti=Union[Tuple[int,int],Tuple[int,int,int]]
ua=Union[int,ti]
a=(3,3)
match a:
    case ti() as ati:
        print("A")
    case _:
        print("B")

错误提示:

error: Class pattern class must not be a type alias with type parameters [misc]

又试了另一种写法:

from linesParser import get_ProcessCell
from typing import List,Tuple,Union

ti=Union[Tuple[int,int],Tuple[int,int,int]]
ua=Union[int,ti]
a=(3,3)
match a:
    case ti(ati):
        print("A")
    case _:
        print("B")

同样得到错误:

error: Class pattern class must not be a type alias with type parameters [misc]

后续尝试2

我还尝试了这种写法,mypy未报错但实际运行无效:

a:ua=(1,3)
if type(a) is ti:
    print("A")
elif type(a) is int:
    print("B")
else:
    print("C")

实际输出为C...


内容的提问来源于stack exchange,提问作者Pierre-olivier Gendraud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 16:52:56