Python中@property在match-case语句内无法正常使用的问题排查
问题原因及解决方法
你的代码里case Bar().foo.ONE:无法工作的核心原因是:Python的match-case语句中,case子句里的属性访问表达式会被解析为「模式结构」,而不是直接计算表达式的值来匹配。
具体来说,当你写case Bar().foo.ONE时,Python会试图把word匹配成一个Bar类的实例,并且要求这个实例的foo属性拥有ONE属性——但你的word是字符串,自然匹配失败。
下面是几种可行的解决方法:
方法1:使用条件守卫
在case后添加if条件判断,直接比较表达式的值:
class Foo: ONE = "one" TWO = "two" THREE = "three" class Bar: @property def foo(self): return Foo word = "one" match word: case Foo.ONE: print("GOOD") case _ if word == Bar().foo.ONE: print("BEST")
方法2:提前计算目标值,用常量匹配
把Bar().foo.ONE的结果存到一个大写命名的变量里(Python会把大写变量视为常量,不会当作捕获变量),再用于case匹配:
class Foo: ONE = "one" TWO = "two" THREE = "three" class Bar: @property def foo(self): return Foo word = "one" TARGET_VALUE = Bar().foo.ONE match word: case Foo.ONE: print("GOOD") case TARGET_VALUE: print("BEST")
方法3:用括号包裹表达式,强制作为值匹配
把表达式放在括号里,Python会先计算表达式的值,再用这个值匹配:
class Foo: ONE = "one" TWO = "two" THREE = "three" class Bar: @property def foo(self): return Foo word = "one" match word: case Foo.ONE: print("GOOD") case (Bar().foo.ONE): print("BEST")
内容的提问来源于stack exchange,提问作者winter
相关产品推荐
相关产品推荐

