Код: Выделить всё
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.NONE в THREE
Однако использование такого условия ограничивает использование нескольких флагов.
Минимальным примером может быть попытка сопоставить OBJ_1 с TYPE_1 (ATTR_1, ATTR_2 или TYPE_1) или OBJ_2 с TYPE_2 (ATTR_3, ATTR_4 или TYPE_2) (проблема не ограничивается таким простым случаем, но это хорошее минимальное представление)
Код: Выделить всё
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_1.TYPE_1:
print('Do 1')
case (Flag_1.OBJ_2, c) if c in Flag_1.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')
что-то подобное ниже невозможно при сопоставлении с образцом ( и, я думаю, будет более адаптирован к оператору if)
Код: Выделить всё
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) \
Подробнее здесь: https://stackoverflow.com/questions/789 ... ombination