Guido van Rossum הציע להוסיף אופרטורים של התאמת דפוסים לפייתון

גידו ואן רוסום הגישו טיוטה לבדיקת הקהילה מפרטים להטמעת אופרטורים של התאמת דפוסים (התאמה ומקרה) ב-Python. יש לציין שהצעות להוספת אופרטורים של התאמת דפוסים כבר פורסמו בשנים 2001 ו-2006 (פפ-0275, פפ-3103), אך נדחו לטובת אופטימיזציה של המבנה "אם ... elif ... else" להידור שרשראות תואמות.

היישום החדש דומה מאוד לאופרטור "התאמה" המסופק ב-Scala, Rust ו-F#, אשר משווה את התוצאה של ביטוי שצוין עם רשימה של דפוסים הרשומים בבלוקים המבוססים על האופרטור "case". בניגוד לאופרטור "switch" הזמין ב-C, Java ו-JavaScript, ביטויים מבוססי "התאמה" מציעים הרבה יותר פונקציונליות רחבה. יצוין כי האופרטורים המוצעים ישפרו את קריאות הקוד, יפשטו את ההשוואה של אובייקטי Python שרירותיים ואיתור באגים, וכן יגבירו את אמינות הקוד הודות לאפשרות הרחבה בדיקת סוג סטטי.

def http_error(סטטוס):
סטטוס התאמה:
מקרה 400:
החזר "בקשה גרועה"
מקרה 401|403|404:
החזר "אסור"
מקרה 418:
חזרה "אני קומקום תה"
מקרה_:
החזר "משהו אחר"

לדוגמה, אתה יכול לפרוק אובייקטים, טופלים, רשימות ורצפים שרירותיים כדי לאגד משתנים על סמך ערכים קיימים. מותר להגדיר תבניות מקוננות, להשתמש בתנאי "אם" נוספים בתבנית, להשתמש במסכות ("[x, y, *rest]"), מיפוי מפתח/ערך (לדוגמה, {"רוחב פס": b, "שהייה ”: l} כדי לחלץ ערכי "רוחב פס" ו-"חביון" ומילון), לחלץ תבניות משנה (":=" אופרטור), השתמש בקבועים בעלי שם בתבנית. במחלקות, ניתן להתאים אישית את התנהגות ההתאמה באמצעות שיטת "__match__()".

מ-dataclasses ייבוא ​​dataclass

@dataclass
נקודת מחלקה:
x:int
y:int

def whereis (נקודה):
נקודת שוויון:
נקודת מקרה (0, 0):
print ("מקור")
נקודת מקרה (0, y):
print(f"Y={y}")
נקודת מקרה (x, 0):
print(f"X={x}")
נקודת מקרה():
print("מקום אחר")
מקרה_:
print("לא נקודה")

נקודת שוויון:
נקודת מקרה (x, y) אם x == y:
print(f"Y=X ב-{x}")
נקודת מקרה (x, y):
print(f"לא באלכסון")

אדום, ירוק, כחול = 0, 1, 2
צבע תואם:
מקרה .RED:
print("אני רואה אדום!")
מקרה .GREEN:
print("דשא ירוק")
מקרה .BLU
E:
print(“אני מרגיש את הבלוז :(“)

ערכה הוכנה לבדיקה טלאים עם ניסיוני יישום המפרט המוצע, אבל הגרסה הסופית עדיין מדובר. לדוגמה, מוצע במקום הביטוי "case _:" עבור ערך ברירת המחדל, השתמש במילת המפתח "else:" או "default:", שכן "_" בהקשרים אחרים משמש כמשתנה זמני. מוטלת בספק גם הארגון הפנימי, שמבוסס על תרגום ביטויים חדשים לקוד בתים בדומה לזה המשמש למבני "אם ... elif ... else", אשר לא יספקו את הביצועים הרצויים בעת עיבוד קבוצות גדולות מאוד של השוואות.

מקור: OpenNet.ru