【Python 语法糖小火锅 · 第 5 涮 · 完结】
一、糖味一句话
Python 3.10+ 的 match-case
把「类型 + 值 + 嵌套」一次性拆开,
可读性 ×10,bug 数 ÷10,if-elif 可以安心退休了。
二、1 行示例 3 连发
# ① 值匹配
match status:case 200: msg = "ok"case 404: msg = "not found"case _: msg = "unknown"# ② 结构匹配 + 守卫
match data:case {"name": str(n), "age": int(a)} if a >= 18:print(f"Adult {n}")case {"name": n}: # 只关心 key,不关心类型print(f"Minor {n}")# ③ 序列匹配带星号
match cmd:case ["copy", src, dst]:shutil.copy(src, dst)case ["move", *files, dst]:for f in files: shutil.move(f, dst)
三、真实场景:JSON API 响应秒解析
需求:根据返回体结构做不同处理。
import requests, sysresp = requests.get(sys.argv[1]).json()match resp:case {"status": "ok", "data": list(items)}:print("Got", len(items), "items")case {"status": "error", "message": str(msg)}:print("Error:", msg)case _:print("Unknown format")
无需层层 if "status" in resp and isinstance(...)
。
四、防踩坑小贴士
match
从上到下短路匹配,顺序即优先级。- 用
_
作通配符,但别把它当变量再用,会覆盖。 - 模式里的变量名会绑定到作用域,注意命名冲突。
- 低于 3.10 的环境无法使用,需回退到 if-elif。
记忆口令 :“match 拆结构,case 当分支;下划线兜底,守卫加条件。”