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
相关产品推荐
相关产品推荐

