מזל טוב: התקבל PEP 634!

יום חג לחנונים שאוהבים פיצ’רים חדשים בפייתון (היי)
החל מגרסה 3.10 יתווסף לפייתון כלי מגניב מאוד שצובר תאוצה בשנים האחרונות בשפות תכנות חדשות.

זה נקרא Pattern Matching וזה עובד כך:

from enum import Enum
class Color(Enum):
    RED = 0
    GREEN = 1
    BLUE = 2

match color:
    case Color.RED:
        print("I see red!")
    case Color.GREEN:
        print("Grass is green")
    case Color.BLUE:
        print("I'm feeling the blues :(")

עד כאן יכול להיות שאתם שואלים “איך זה שונה מ־if/elif/else?” (או מ־switch case אם אתם נודדים משפות אחרות).

אחד ההבדלים הוא שאפשר, בעזרת תחביר מאוד פשוט, לבקש מפייתון לבחור הסתעפות לפי סוג/גודל המבנה:

match command.split():
    case [action]:
        ... # interpret single-verb action
    case [action, obj]:
        ... # interpret action, obj

מה שקורה שם זה שפייתון מוצא איך האובייקט שלכם נראה (איבר 1 אחרי ה־split? שני איברים?) והולך ל־case הרלוונטי.

אבל השוס האפילו יותר גדול, זה ש"על הדרך" הוא מבצע השמה: מה שיש באיבר הראשון ייכנס ל־action, ומה שיש באיבר השני (אם יש שני איברים) יכנס ל־object.

אפשר לממש ככה דברים יותר מסובכים וזה נראה ממש טוב:

match point:
    case (0, 0):
        print("Origin")
    case (0, y):
        print(f"Y={y}")
    case (x, 0):
        print(f"X={x}")
    case (x, y):
        print(f"X={x}, Y={y}")
    case _:
        raise ValueError("Not a point")

לעוד פרטים, ראו את המדריך לשימוש ב־PEP 634 כאן (נקרא PEP 636).

13 לייקים

חחח יצא על זה מחברת?

לייק 1

אם תכתוב אחת? בוודאי

3 לייקים

סוף סוף! משהו כמו switch case לפייטון.

לייק 1

חשוב להגיד שזה רק מזכיר קצת switch במראה, בפועל חוץ מקצת דמיון ראשוני אין כ"כ קשר.
בד"כ switch case הוא מבנה fall through – כלומר, אם מתאמתים על האופציה הראשונה ממשיכים לשנייה ושלישית. בהרבה מקרים מתכנתים מוסיפים break אחרי כל אופציה כדי לנטרל את ההתנהגות הזו, מה שגורם למבנה להיות קצת מכוער ומנופח ויזואלית (וגורם לבאגים מעצבנים כי מתכנתים שוכחים להוסיף break).
יותר חשוב – switch case לא אחראי על bindings, כלומר, אי אפשר לעשות באמצעותו השמות. כאן יש את התוספת המגניבה והחשובה של השמה תוך כדי בדיקה, וזה סופר שימושי בהמון מקרים :tada:

הצעות קודמות להוסיף switch בפייתון נתקלו בהתנגדות חזקה של הקהילה, כי יש תחלופות פשוטות וברורות יותר – כמו בחירת ערך מילון או מבנה של if/elif/else :slight_smile:

6 לייקים

נראה מצויין וסופר שימושי! תודה!

סופסוף…
אולי עכשיו אצליח לשכנע את המנהל להתקדם מ-Cobol/Rpg
בסה"כ יש להם Select/case משנות ה-70