گویدو فان روسوم پیشنویس برای بررسی عمومی برای پیادهسازی عملگرهای تطبیق الگو (match و case) در پایتون. لازم به ذکر است که پیشنهادهایی برای افزودن عملگرهای تطبیق الگو قبلاً در سالهای ۲۰۰۱ و ۲۰۰۶ منتشر شده است (, ) ، اما به نفع بهینهسازی ساختار "if ... elif ... else" برای ساخت زنجیرههای منطبق رد شدند.
پیادهسازی جدید بسیار شبیه به عملگر "match" ارائه شده در Scala، Rust و F# است که نتیجه یک عبارت مشخص شده را با لیستی از الگوهای مشخص شده در بلوکهای مبتنی بر حروف کوچک و بزرگ مقایسه میکند. برخلاف عملگر "switch" موجود در C، Java و JavaScript، عبارات مبتنی بر "match" امکانات بسیار بیشتری ارائه میدهند. لازم به ذکر است که عملگرهای پیشنهادی، خوانایی کد را بهبود میبخشند، مقایسه اشیاء دلخواه پایتون و اشکالزدایی را ساده میکنند و همچنین به دلیل امکان توسعهپذیری، قابلیت اطمینان کد را افزایش میدهند. .
تعریف http_error(وضعیت):
وضعیت مسابقه:
مورد 400:
برگرداندن "درخواست بد"
پرونده ۴۰۱|۴۰۳|۴۰۴:
برگرداندن "مجاز نیست"
مورد 418:
برگرداندن «من یک قوری هستم»
مورد _:
برگرداندن "چیز دیگری"
برای مثال، میتوان اشیاء، تاپلها، لیستها و توالیهای دلخواه را برای اتصال متغیرها بر اساس مقادیر موجود، از حالت فشرده خارج کرد. میتوان قالبهای تو در تو تعریف کرد، از شرطهای "if" اضافی در یک قالب استفاده کرد، ماسکها ("[x, y, *rest]") را اعمال کرد، جفتهای کلید/مقدار را نگاشت کرد (مثلاً {"bandwidth": b, "latency": l} برای استخراج مقادیر "bandwidth" و "latency" و یک دیکشنری)، زیرقالبها را استخراج کرد (عملگر ":=") و از ثابتهای نامگذاری شده در یک قالب استفاده کرد. رفتار تطبیق را میتوان در کلاسها با استفاده از روش "__match__()" سفارشی کرد.
از کلاس های داده وارد کلاس داده می شود
@dataclass
نقطه کلاس:
ایکس: عدد صحیح
ی: عدد صحیح
تعریف مکان (نقطه):
نقطه تطابق:
نقطه مورد (0، 0):
چاپ("مبدا")
نقطه مورد (0، y):
چاپ(f»Y={y}»)
نقطه مورد (x، 0):
چاپ(f»X={x}»)
نقطه مورد ():
چاپ("جایی دیگر")
مورد _:
چاپ("امتیاز نیست")
نقطه تطابق:
نقطه مورد نظر (x، y) اگر x == y:
چاپ(f»Y=X در {x}»)
نقطه مورد (x، y):
چاپ(f"روی قطر نیست")
قرمز، سبز، آبی = ۰، ۱، ۲
رنگ مطابقت:
مورد .RED:
چاپ("من قرمز میبینم!")
مورد .سبز:
چاپ("چمن سبز است")
مورد .BLU
E:
چاپ("من احساس افسردگی میکنم :(")
مجموعهای از مطالب برای بررسی آماده شده است. با آزمایش مشخصات پیشنهادی، اما نسخه نهایی هنوز ... . به عنوان مثال به جای عبارت "case _:" برای مقدار پیشفرض، از کلمه کلیدی "else:" یا "default:" استفاده کنید، زیرا "_" در زمینههای دیگر به عنوان یک متغیر موقت استفاده میشود. سازماندهی داخلی، مبتنی بر ترجمه عبارات جدید به بایتکد مشابه آنچه برای ساختارهای "if...elif...else" استفاده میشود، سوالاتی را نیز مطرح میکند که هنگام پردازش مجموعههای بسیار بزرگ مقایسه، عملکرد مطلوب را ارائه نمیدهد.
منبع: opennet.ru
