Почему выражение не сравнивается с шаблоном в case match?

Python 3.11. Пример кода:

number = 1
num1 = 2
num2 = 4
num3 = 1

match number:
    case num1:
        print("num1")
    case num2:
        print("num2")
    case num3:
        print("num3")
    case _:
        print("number")

Получаю ошибку:

case num1:
     ^^^^
SyntaxError: name capture 'num1' makes remaining patterns unreachable

Почему 'num1' делает остальные шаблоны недоступными?

Но если заменить переменные num1, num2, num3 на строки, например "num1" и т.д., то все работает, т.е. сравнение со строкой выполняется, а сравнение с переменной не проходит, почему?


Ответы (2 шт):

Автор решения: Даня

Имя переменной в предложении case рассматривается как шаблон захвата имени.

Вы можете создать класс с вашими атрибутами, это должно решить вашу проблему.

class Number:
    num1 = 1
    num4 = 4


number = 1
match number:
    case Number.num1:
        print("num1")
    case Number.num4:
        print('num 4')
→ Ссылка
Автор решения: Oopss

Почему 'num1' делает остальные шаблоны недоступными?

Потому что переменная num1, захватывает значение number, без условий, теперь num1 равна number, естественно после этого другие шаблоны не доступны.

Но если заменить переменные num1, num2, num3 на строки, например "num1" и т.д., то все работает, т.е. сравнение со строкой выполняется, а сравнение с переменной не проходит, почему?

Потому что в этом конкретном случае, происходит сравнение по строкам, так же может происходить сравнение по буквам, числам или булевым значениям.

→ Ссылка