Python 3.10 match语句中1与True的匹配规则是怎样的?
你观察到的差异是CPython对布尔字面量的匹配做了特殊处理,和PEP622最初的描述不一致,具体匹配规则如下:
- 当匹配分支是
case True/case False时,CPython会做两步判断:- 先检查被匹配值的类型是否为
bool,如果不是直接跳过该分支 - 类型符合的前提下,再判断值是否相等
这就是为什么match 1:不会触发case True分支——1的类型是int,直接被过滤了。
- 先检查被匹配值的类型是否为
- 当匹配分支是
case 1这种非布尔的字面量时,不会做额外的类型检查,直接调用__eq__判断值是否相等。因为True == 1返回True,所以match True:会触发case 1分支。
PEP622最初的文档描述确实提到字面量匹配完全依赖__eq__,但后续实现阶段核心开发者考虑到布尔值和整数互等会带来大量意料之外的匹配错误,所以特意给布尔字面量的匹配加了前置类型检查的逻辑,官方文档后续也做了对应修正。
你可以通过下面的代码验证这个逻辑:
# 只有bool类型的1才会匹配case True match True: case True: print("匹配成功") # 输出:匹配成功 match 1: case True: print("匹配成功") # 无输出 # 整型字面量不做类型检查 match True: case 1: print("匹配成功") # 输出:匹配成功
内容的提问来源于stack exchange,提问作者umitu
相关产品推荐
相关产品推荐

