Π“Π²ΠΈΠ΄ΠΎ Π²Π°Π½ Россум ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² Python ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ для сопоставлСния с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ

Π“Π²ΠΈΠ΄ΠΎ Π²Π°Π½ Россум (Guido van Rossum) прСдставил Π½Π° рассмотрСниС сообщСством Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊ спСцификации для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² языкС Python ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² для сопоставлСния с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ (match ΠΈ case). Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ прСдлоТСния ΠΏΠΎ добавлСнию ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² сопоставлСния с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ ΡƒΠΆΠ΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈΡΡŒ Π² 2001 ΠΈ 2006 Π³ΠΎΠ΄Π°Ρ… (pep-0275, pep-3103), Π½ΠΎ Π±Ρ‹Π»ΠΈ ΠΎΡ‚Π²Π΅Ρ€Π³Π½ΡƒΡ‚Ρ‹ Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ конструкции «if … elif … else» для составлСния Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ сопоставлСния.

Новая рСализация Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ «match», прСдоставляСмый Π² языках Scala, Rust ΠΈ F#, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт сравнСниС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° выполнСния ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ выраТСния со списком ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠ², пСрСчислСнных Π² Π±Π»ΠΎΠΊΠ°Ρ… Π½Π° основС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° «case». Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° «switch», доступного Π² языках Π‘ΠΈ, Java ΠΈ JavaScript, выраТСния Π½Π° основС «match» ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ΠžΡ‚ΠΌΠ΅Ρ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ позволят ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°, упростят сопоставлСниС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Python-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ повысят Π½Π°Π΄Ρ‘ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° благодаря возмоТности Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΉ статичСской ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ².

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__()».

from dataclasses import dataclass

@dataclass
class Point:
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 :(«)

Для рСцСнзирования ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½ Π½Π°Π±ΠΎΡ€ ΠΏΠ°Ρ‚Ρ‡Π΅ΠΉ с ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ спСцификации, Π½ΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π΅Ρ‰Ρ‘ обсуТдаСтся. НапримСр, прСдлагаСтся вмСсто выраТСния «case _:» для значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово «else:» ΠΈΠ»ΠΈ «default:», Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ «_» Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… контСкстах примСняСтся ΠΊΠ°ΠΊ врСмСнная пСрСмСнная. Π’Π°ΠΊΠΆΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ вопросы внутрСнняя организация, основанная Π½Π° трансляции Π½ΠΎΠ²Ρ‹Ρ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΌΡƒ для конструкций «if … elif … else», Ρ‡Ρ‚ΠΎ Π½Π΅ обСспСчит ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΎΡ‡Π΅Π½ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π½Π°Π±ΠΎΡ€ΠΎΠ² сопоставлСний.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru