Python 3中使用match语句匹配类时出现错误匹配的原因咨询
Python 3中使用match语句匹配类时出现错误匹配的原因咨询
嘿,这个问题其实是对Python match语句的模式匹配规则理解有个小误区,我来给你掰扯清楚~
你代码里出现的“错误匹配”,核心问题出在case Two:这一行的写法上:这里的Two并不是在匹配你定义的Two类对象,而是被Python解释成了一个「捕获变量」。
在match语句的模式规则里,单独的标识符(比如Two、x这种单个名字)会被当成一个捕获变量——它会接收match目标的任何值,然后直接执行这个case块里的代码。所以不管你match的是One类还是其他什么对象,这个case都会被触发,因为它根本没在做“是不是Two类”的判断,只是把值存到了这个叫Two的变量里而已。
那要怎么正确匹配Two这个类对象呢?你需要用**守卫条件(guard clause)**来做精确判断,也就是在case后面加if来明确对比:
>>> class One: ... pass ... >>> class Two: ... pass ... >>> a = One() >>> >>> match a.__class__: ... case cls if cls is Two: ... print("is two") ... case cls if cls is One: ... print("is one") ... is one
或者更直接点,也可以写成这样,效果是一样的:
>>> match a.__class__: ... case _ if a.__class__ is Two: ... print("is two") ... case _: ... print("not two") ... not two
另外补充个小知识点:如果你的需求是匹配实例的类型(比如判断a是不是Two的实例),通常我们会直接写case Two():来匹配,但你这里是直接匹配类对象本身,所以必须用守卫条件来做精确的is判断才行。
备注:内容来源于stack exchange,提问作者knipknap
相关产品推荐
相关产品推荐

