Привет, я использовал недавно добавленную функцию совпадения регистров, но столкнулся с этой проблемой.

Вот мой код:

from typing import List

class Wee():
    def __init__(self) -> None:
        self.lololol: List[str] = ["car", "goes", "brrrr"]

    def func1(self):
        self.weee = input()
        try:
            match self.weee:
                case self.lololol[0]:
                    print(self.lololol[0])
                case self.lololol[1]:
                    print(self.lololol[1])
                case _:
                    print(self.lololol[2])
        except SyntaxError as e:
            print(e)

waa = Wee()
waa.func1()

В строках 11 и 13 появляются ошибки SyntaxError: expected ':'. Однако, когда я меняю case self.lololol[0]: на case "car":, ошибки исчезают. Что случилось?

0
Aquger 4 Фев 2022 в 10:28

2 ответа

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

Если вы хотите сопоставить элементы списка, вам, вероятно, следует, в зависимости от ситуации, либо сделать их отдельными переменными, либо использовать list.index.

0
LeopardShark 4 Фев 2022 в 10:33

Это связано с тем, что оператор match case предназначен для структурного сопоставления. В частности, PEP 635 говорит:

Хотя на первый взгляд шаблоны могут выглядеть как выражения, важно помнить о четком различии. На самом деле ни один шаблон не является выражением и не содержит его. Более продуктивно думать о шаблонах как о декларативных элементах, подобных формальным параметрам в определении функции.

В частности, простые переменные используются как шаблоны захвата, а не как шаблоны сопоставления - определенно не то, что мог бы ожидать программист C/C++... - и функции или индексы или просто не разрешены.

С практической точки зрения в качестве шаблонов соответствия могут использоваться только буквенные или точечные выражения.

0
Serge Ballesta 4 Фев 2022 в 11:14