Гвідо ван Россум (Guido van Rossum)
Нова реалізація багато в чому нагадує оператор «match», що надається у мовах Scala, Rust і F#, який виконує порівняння результату виконання зазначеного виразу зі списком зразків, перерахованих у блоках на основі оператора «case». На відміну від оператора switch, доступного в мовах Сі, Java і JavaScript, вирази на основі match пропонують набагато більше
def http_error(status):
match status:
case 400:
return "Bad request"
case 401|403|404:
return «Not allowed»
case 418:
return «I'm a teapot»
case _:
return «Something else»
Наприклад, можливе розпакування об'єктів, кортежів, списків та довільних послідовностей для прив'язки змінних на основі наявних значень. Допускається визначення вкладених шаблонів, використання у шаблоні додаткових умов «if», застосування масок («[x, y, *rest]»), мапінгу зв'язок ключ/значення (наприклад, {«bandwidth»: b, «latency»: l} для отримання значень «bandwidth» і «latency» і словника), отримання підшаблонів (оператор «:=»), використання іменованих констант у шаблоні. У класах можливе налаштування поведінки зі зіставлення з допомогою методу «__match__()».
від dataclasses import dataclass
@dataclass
бал класу:
x: int
y: int
def whereis(point):
match point:
case Point(0, 0):
print(«Origin»)
case Point(0, y):
print(f»Y={y}»)
case Point(x, 0):
print(f»X={x}»)
case Point():
print("Somewhere else")
case _:
print("Not a point")
match point:
case Point(x, y) if x == y:
print(f»Y=X at {x}»)
case Point(x, y):
print(f"Not on the diagonal")
RED, GREEN, BLUE = 0, 1, 2
match color:
case .RED:
print(«I see red!»)
case .GREEN:
print(«Grass is green»)
case .BLU
E:
print(«I'm feeling the blues :(«)
Для рецензування підготовлено набір
Джерело: opennet.ru