Python枚举Flag组合的模式匹配优化方法咨询
Python Flag枚举组合场景的模式匹配优化方案
在Python中使用Flag枚举时,模式匹配仅能捕获直接相等的情况,无法识别Flag的包含关系。可以通过条件判断结合in关键字规避,但需要先处理特殊的0值Flag:
from enum import Flag class Test(Flag): ONE = 1 TWO = 2 THREE = ONE | TWO NONE = 0 def match_one(pattern): match pattern: case Test.THREE: print(pattern, 'Three') case Test.ONE: print(pattern, 'ONE') case v if v in Test.THREE: print(pattern, 'in THREE') case _: print(pattern, 'Other')
运行后输出:
Test.ONE ONE
Test.TWO in THREE
Test.THREE Three
Test.NONE in THREE
但在多Flag组合的场景下,这类条件判断存在局限。比如要匹配OBJ_1与TYPE_1(包含ATTR_1、ATTR_2或TYPE_1本身)、OBJ_2与TYPE_2(包含ATTR_3、ATTR_4或TYPE_2本身)的场景,先定义两个Flag枚举:
class Flag_1(Flag): OBJ_1 = 1 OBJ_2 = 2 NONE = 0 class Flag_2(Flag): ATTR_1 = 1 ATTR_2 = 2 ATTR_3 = 4 ATTR_4 = 8 TYPE_1 = ATTR_1 | ATTR_2 TYPE_2 = ATTR_3 | ATTR_4 NONE = 0
现有两种实现方案,但都存在明显问题:
方案一:条件判断式匹配
match flag1, flag2: case Flag_1.NONE, _ | _, Flag_2.NONE: print('Useless') case (Flag_1.OBJ_1, c) if c in Flag_2.TYPE_1: print('Do 1') case (Flag_1.OBJ_2, c) if c in Flag_2.TYPE_2: print('Do 1') case _: print('Other stuff')
问题:当组合数量较多时,会产生大量重复代码,维护成本高。
方案二:显式列举组合
match flag1, flag2: case Flag_1.NONE, _ | _, Flag_2.NONE: print('Useless') case (Flag_1.OBJ_1, Flag_2.ATTR_1 | Flag_2.ATTR_2) \ | (Flag_1.OBJ_2, Flag_2.ATTR_3 | Flag_2.ATTR_4): print('Do 1') case _: print('Other stuff')
问题:如果TYPE包含多个Flag,代码会变得冗长不堪,可读性差。
此外,以下两种写法要么语法错误,要么无法正常工作:
case (Flag_1.OBJ_1, c) if c in Flag_2.TYPE_1 \ | (Flag_1.OBJ_2, c) if c in Flag_2.TYPE_2: # invalid syntax
case (Flag_1.OBJ_1, Flag_2.TYPE_1) \ | (Flag_1.OBJ_2, Flag_2.TYPE_2) \
请问是否存在更优方案,无需为每种组合单独编写case或改用if语句,即可实现组合Flag的模式匹配?
内容的提问来源于stack exchange,提问作者JackRed
相关产品推荐
相关产品推荐

