Guido van Rossum اضافه کردن عملگرهای تطبیق الگو به پایتون را پیشنهاد کرد

گیدو ون روسوم معرفی شده پیش نویس برای بررسی جامعه مشخصات فنی برای پیاده سازی عملگرهای تطبیق الگو (مطابقت و حروف کوچک) در پایتون. لازم به ذکر است که پیشنهادهایی برای اضافه کردن عملگرهای تطبیق الگو قبلاً در سالهای 2001 و 2006 منتشر شده است.pep-0275, pep-3103) ، اما به نفع بهینه سازی ساختار "if ... elif ... else" برای کامپایل زنجیره های تطبیق رد شدند.

پیاده سازی جدید بسیار شبیه عملگر "Match" ارائه شده در Scala، Rust و F# است که نتیجه یک عبارت مشخص شده را با لیستی از الگوهای فهرست شده در بلوک ها بر اساس عملگر "case" مقایسه می کند. برخلاف اپراتور "switch" موجود در C، جاوا و جاوا اسکریپت، عبارات مبتنی بر "مطابقت" چیزهای بیشتری را ارائه می دهند. عملکرد گسترده. خاطرنشان می شود که اپراتورهای پیشنهادی خوانایی کد را بهبود می بخشد، مقایسه اشیاء پایتون دلخواه و اشکال زدایی را ساده می کند و همچنین قابلیت اطمینان کد را به لطف امکان توسعه یافته افزایش می دهد. بررسی نوع استاتیک.

def http_error(وضعیت):
وضعیت مسابقه:
مورد 400:
بازگشت "درخواست بد"
مورد 401|403|404:
بازگشت "مجاز نیست"
مورد 418:
بازگشت "من یک قوری هستم"
مورد_:
بازگشت "چیزی دیگر"

برای مثال، می‌توانید اشیا، تاپل‌ها، لیست‌ها و دنباله‌های دلخواه را برای اتصال متغیرها بر اساس مقادیر موجود باز کنید. مجاز به تعریف الگوهای تو در تو، استفاده از شرایط "if" اضافی در الگو، استفاده از ماسک ("[x, y، *rest]")، نگاشت کلید/مقدار (به عنوان مثال، {"پهنای باند": b، "تاخیر" ”: l} برای استخراج مقادیر "پهنای باند" و "تأخیر" و فرهنگ لغت)، استخراج الگوهای فرعی (":=" عملگر)، از ثابت های نامگذاری شده در قالب استفاده کنید. در کلاس‌ها، می‌توان رفتار تطبیق را با استفاده از روش "__match__()" سفارشی کرد.

از کلاس های داده وارد کلاس داده می شود

@dataclass
نقطه کلاس:
x:int
y:int

def whereis(point):
نقطه تطبیق:
Case Point (0, 0):
چاپ ("منشا")
Point (0, y):
چاپ (f"Y={y}")
Point (x, 0):
چاپ (f"X={x}")
case Point():
چاپ ("جایی دیگر")
مورد_:
چاپ ("نقطه ای نیست")

نقطه تطبیق:
مورد نقطه (x, y) اگر x == y:
چاپ (f"Y=X در {x}")
Point (x, y):
چاپ (f"نه روی مورب")

قرمز، سبز، آبی = 0، 1، 2
رنگ مطابقت:
مورد .قرمز:
چاپ ("من قرمز می بینم!")
مورد .سبز:
چاپ ("علف سبز است")
مورد .BLU
E:
چاپ ("من بلوز را احساس می کنم :(")

مجموعه ای برای بررسی آماده شده است تکه ها با تجربی پیاده سازی مشخصات پیشنهادی، اما نسخه نهایی هنوز وجود دارد بحث شده. به عنوان مثال ارایه شده به جای عبارت "case _:" برای مقدار پیش فرض، از کلمه کلیدی "else:" یا "default:" استفاده کنید، زیرا "_" در زمینه های دیگر به عنوان یک متغیر موقت استفاده می شود. همچنین سازمان داخلی سوال برانگیز است که مبتنی بر ترجمه عبارات جدید به بایت کد مشابه آنچه برای ساختارهای "if... elif... else" استفاده می شود، است که عملکرد مطلوب را هنگام پردازش مجموعه های بسیار بزرگ مقایسه ارائه نمی دهد.

منبع: opennet.ru

اضافه کردن نظر