Python 中使用 match 语句按类型匹配值的正确方法
技术百科
花韻仙語
发布时间:2025-12-30
浏览: 次 python 3.10+ 的 `match` 语句不支持直接用 `case str:` 匹配类型,因为 `str` 会被解释为变量捕获名;应改用 `case str():` 模式,它能安全、准确地匹配字符串实例。
在 Python 的结构化模式匹配中,match 语句的设计原则是:裸类型名(如 str、int、list)在 case 子句中默认被视为“名称捕获”(name capture),而非类型检查。这意味着:
match lang:
case str: # ❌ 错误!这等价于 `case str as str:` —— 将值绑定到新变量 `str`,覆盖内置类型
...该写法不仅会静默覆盖内置 str(如提问者发现的 str = 7),还会导致后续 case 永远不可达(SyntaxError 提示 “unreachable” 正源于此),因为它已“消耗”了所有输入。
✅ 正确做法是使用 类模式(class pattern):str()(注意括号)。它明确表示“匹配任意 str 类型的实例”,不进行变量绑定,也不修改任何名称:
lang = "Python"
match lang:
case str(): # ✅ 匹配所有字符串实例(包括 str 子类)
print("It is a string.")
case int():
print("It is an integer.")
case list():
print("It is a list.")
case _:
print("It is something else.")? 补充说明:str() 是一个“无参数类模式”,等价于 str(_)(即忽略内部内容,只检查类型)。你也可以添加子模式,例如 case str(name) 捕获字符串并赋值给 name,或 case str(s) if len(s) > 10 加入守卫条件。
⚠️ 注意事项:
- 不要写 case type(lang): 或 case type(str): —— 这既冗余又错误,match 本身不支持运行时类型对象作为字面量模式;
- 所有内置类型(int, float, dict, tuple, bool 等)及自定义类(需支持模式匹配协议)均可采用 Type() 形式;
- 若需精确匹配具体类(排除子类),可结
合 isinstance() 守卫:case x if isinstance(x, str) and type(x) is str,但通常 str() 已满足绝大多数场景。
总结:match 的类型匹配本质是实例类型检查,而非类型对象比较。牢记 str()(带括号)是模式,str(无括号)是变量——这是掌握 Python 模式匹配的关键分水岭。
# python
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么连接投影仪_Win11多显示器投屏设
- PhpStorm怎么调试PHP代码_PhpStor
- Win11怎么激活Windows10_Win11激
- c++如何实现一个高性能的环形队列(Ring Bu
- Win11怎么查看显卡显存_查询Win11显卡详细
- 如何使用Golang匿名函数_快速定义临时函数逻辑
- Python模块的__name__属性如何由导入方
- 如何在Golang中优化文件读写性能_使用缓冲和并
- Windows10系统怎么查看CPU温度_Win1
- 如何在Golang中实现邮件发送功能_Golang
- php8.4如何配置ssl证书_php8.4htt
- Python 模块的 __name__ 属性如何由
- php控制舵机角度怎么调_php发送pwm信号控制
- Golang如何遍历目录文件_Golang fil
- Win11如何设置ipv6 Win11开启IPv6
- PHP 中如何在函数内持久化修改引用变量的指向
- Win10如何设置双wan路由器 Win10双wa
- XSLT怎么生成动态的HTML属性名和标签名
- C++中的Pimpl idiom是什么,有什么好处
- 如何在Golang中实现CI/CD流水线自动化测试
- Win11快速助手怎么用_Win11远程协助连接教
- Python装饰器复用技巧_通用能力解析【教程】
- GML (Geography Markup Lan
- Win11局域网共享怎么设置 Win11文件夹网络
- Mac上的iMovie如何剪辑视频?(新手入门教程
- Win11怎么设置右键刷新选项_Windows11
- Windows10如何更改计算机工作组_Win10
- Win11怎么禁用键盘自带键盘_Win11笔记本禁
- Win11怎么设置任务栏图标大小_Windows1
- 如何在 Laravel 中通过嵌套关联关系进行 o
- Python文本编码与解码_跨平台解析说明【指导】
- Python数据挖掘进阶教程_分类回归与聚类案例解
- 零基础学会Python自动化办公_高效处理Exce
- Win11怎么开启远程桌面连接_Windows11
- LINUX怎么查看进程_LINUX ps命令查看运
- Windows蓝屏错误0x0000002C怎么解决
- php本地部署支持nodejs吗_php与node
- 如何在 ACF 中正确更新嵌套多层 Group 字
- Win11怎么检查TPM2.0模块_Windows
- 如何在 Go 开发中正确处理本地包导入与远程模块路
- php下载安装后swoole扩展怎么安装_异步框架
- VSC怎么在PHP中调试MySQL_数据库交互排查
- Go 中 := 短变量声明的类型推导机制详解
- Python网络日志追踪_请求定位解析【教程】
- php485返回数据不完整怎么办_php485数据
- C++如何使用std::transform批量处理
- c++怎么实现高并发下的无锁队列_c++ std:
- Win11怎么更改任务栏颜色_Windows11个
- Win11如何关闭小娜Cortana Win11禁
- ACF 教程:如何正确更新嵌套在多层 Group

合 isinstance() 守卫:case x if isinstance(x, str) and type(x) is str,但通常 str() 已满足绝大多数场景。
QQ客服