你能在Python类型上进行模式匹配吗?
我见过简单的例子:
import builtins
match x:
case builtins.str:
print("matched str")
case buildins.int:
print("matched int")
但我想在嵌套类型上进行模式匹配,比如
Annotated[Optional[Literal["a", "b", "c"]], "something here"]
-这可能吗?
是的,你可以在 Python 中对类型注释执行某种形式的模式匹配,但不能直接使用
match
语句。你必须使用类型提示模块中的
isinstance
或
issubclass
函数。
以下是如何对
Annotated[Optional[Literal["a", "b", "c"]], "something here"]
执行此操作的方法:
from typing import Annotated, Literal, Optional
from typing_extensions import get_args, get_origin
def check_type(x):
if (isinstance(x, Annotated)
and get_origin(x) is Annotated
and len(get_args(x)) == 2
and get_args(x)[1] == "something here"
and get_origin(get_args(x)[0]) is Optional
and get_origin(get_args(get_args(x)[0])[0]) is Literal
and set(get_args(get_args(get_args(x)[0])[0])) == {"a", "b", "c"}):
print("匹配")
else:
print("不匹配")
# 测试用例
check_type(Annotated[Optional[Literal["a", "b", "c"]], "something here"]) # 匹配
check_type(Annotated[Optional[Literal["a", "b"]], "something here"]) # 不匹配
check_type(Annotated[Optional[Literal["a", "b", "c"]], "something else"]) # 不匹配
这种方法检查类型的结构和文字值。它不如
match
语句简洁,但在 Python 中处理类型注释时是必要的。
请注意,
Annotated
、
Literal
和
Optional
是 Python 3.9 中引入的。对于旧版本,你需要使用
typing_extensions
包。