Учитывая следующее определение:
Код: Выделить всё
class MyEnum(IntEnum):
a = 1
b = 2
c = 3
d = 4
Я ищу выражение, которое заменяет SomeExpression, которое будет статически утверждать, что значение myEnum равно либо MyEnum.c | MyEnum.d в этой ветке – так что регистр «никогда» внизу правильно определяет тип никогда – и, конечно же, во время выполнения будет гарантировать, что выбрана правильная ветвь, такая что «соответствует» выводится на консоль.
Код: Выделить всё
def check(myEnum: MyEnum):
match myEnum:
case SomeExpression:
print("matched")
case MyEnum.a:
pass
case MyEnum.b:
pass
case never:
assert_never(never)
Мне известно, что MyEnum.c | MyEnum.d — это выражение, удовлетворяющее этому требованию, но я ищу псевдоним для этого типа объединения, который также может выполнять проверку во время выполнения. Мотивация состоит в том, чтобы иметь возможность обновлять это в одном месте, чтобы мне не приходилось обновлять каждое совпадение, где используется этот союз. Очевидно, я мог бы использовать для этого предикат и возвращать набор совпадающих значений, которые я обновляю в одном месте, но это не проверяет типы.
Есть ли такой способ добиться этого в Python? Я пробовал использовать более простые методы, такие как предикат внутри совпадения, который не сужает тип статически, как хотелось бы. Я также исследовал __class_getitem__, но не смог заставить его работать должным образом.
Подробнее здесь:
https://stackoverflow.com/questions/788 ... e-matching