Ο Guido van Rossum πρότεινε την προσθήκη τελεστών αντιστοίχισης προτύπων στην Python

Guido van Rossum εισήχθη προσχέδιο για κοινοτική αναθεώρηση Προδιαγραφές για την υλοποίηση τελεστών αντιστοίχισης προτύπων (ταιριάζουν και πεζά) στην Python. Πρέπει να σημειωθεί ότι προτάσεις για την προσθήκη τελεστών αντιστοίχισης προτύπων έχουν ήδη δημοσιευθεί το 2001 και το 2006 (pep-0275, pep-3103), αλλά απορρίφθηκαν υπέρ της βελτιστοποίησης της κατασκευής "if ... elif ... else" για τη μεταγλώττιση αλυσίδων αντιστοίχισης.

Η νέα υλοποίηση μοιάζει πολύ με τον τελεστή "ταιριάσματος" που παρέχεται στα Scala, Rust και F#, ο οποίος συγκρίνει το αποτέλεσμα μιας καθορισμένης έκφρασης με μια λίστα μοτίβων που παρατίθενται σε μπλοκ με βάση τον τελεστή "case". Σε αντίθεση με τον τελεστή "switch" που είναι διαθέσιμος σε C, Java και JavaScript, οι εκφράσεις που βασίζονται σε "ταιριάζουν" προσφέρουν πολύ περισσότερα ευρεία λειτουργικότητα. Σημειώνεται ότι οι προτεινόμενοι τελεστές θα βελτιώσουν την αναγνωσιμότητα του κώδικα, θα απλοποιήσουν τη σύγκριση αυθαίρετων αντικειμένων Python και τον εντοπισμό σφαλμάτων και επίσης θα αυξήσουν την αξιοπιστία του κώδικα χάρη στη δυνατότητα επέκτασης έλεγχος στατικού τύπου.

Def http_error(status):
κατάσταση αγώνα:
περίπτωση 400:
επιστροφή "Κακό αίτημα"
υπόθεση 401|403|404:
επιστροφή "Δεν επιτρέπεται"
περίπτωση 418:
επιστροφή "Είμαι τσαγιέρα"
υπόθεση_:
επιστροφή "Κάτι άλλο"

Για παράδειγμα, μπορείτε να αποσυσκευάσετε αντικείμενα, πλειάδες, λίστες και αυθαίρετες ακολουθίες για να συνδέσετε μεταβλητές με βάση τις υπάρχουσες τιμές. Επιτρέπεται ο ορισμός ένθετων προτύπων, η χρήση πρόσθετων συνθηκών "if" στο πρότυπο, η χρήση μασκών ("[x, y, *rest]"), αντιστοιχίσεις κλειδιών/τιμών (για παράδειγμα, {"εύρος ζώνης": b, "latency ”: l} για να εξαγάγετε τιμές και λεξικό "εύρος ζώνης" και "λανθάνουσα κατάσταση", να εξαγάγετε υποπρότυπα (":=" τελεστής), να χρησιμοποιήσετε επώνυμες σταθερές στο πρότυπο. Στις κλάσεις, είναι δυνατή η προσαρμογή της συμπεριφοράς αντιστοίχισης χρησιμοποιώντας τη μέθοδο "__match__()".

από κλάσεις δεδομένων εισαγωγής κατηγορίας δεδομένων

@dataclass
Σημείο τάξης:
x:int
y:int

def whereis(point):
στο σημειο του αγωνα:
case Point(0, 0):
εκτύπωση ("Προέλευση")
περίπτωση Σημείο(0, y):
print(f"Y={y}")
περίπτωση Σημείο(x, 0):
εκτύπωση(f"X={x}")
case Point():
εκτύπωση ("Κάπου αλλού")
υπόθεση_:
εκτύπωση ("Όχι ένα σημείο")

στο σημειο του αγωνα:
περίπτωση Σημείο(x, y) αν x == y:
εκτύπωση (f"Y=X σε {x}")
περίπτωση Σημείο(x, y):
εκτύπωση (f"Όχι στη διαγώνιο")

ΚΟΚΚΙΝΟ, ΠΡΑΣΙΝΟ, ΜΠΛΕ = 0, 1, 2
χρώμα ταιριάσματος:
θήκη .ΚΟΚΚΙΝΟ:
εκτύπωση ("Βλέπω κόκκινο!")
περίπτωση .ΠΡΑΣΙΝΟ:
εκτύπωση ("Το γρασίδι είναι πράσινο")
θήκη .BLU
E:
print ("Αισθάνομαι τα μπλουζ :(")

Έχει ετοιμαστεί ένα σετ για έλεγχο μπαλώματα με πειραματικό εκτέλεση προτεινόμενη προδιαγραφή, αλλά η τελική έκδοση είναι ακόμα συζητήθηκε. Για παράδειγμα προσφέρεται Αντί για την έκφραση "case _:" για την προεπιλεγμένη τιμή, χρησιμοποιήστε τη λέξη-κλειδί "else:" ή "default:", καθώς το "_" σε άλλα περιβάλλοντα χρησιμοποιείται ως προσωρινή μεταβλητή. Επίσης αμφισβητήσιμη είναι η εσωτερική οργάνωση, η οποία βασίζεται στη μετάφραση νέων εκφράσεων σε bytecode παρόμοιο με αυτό που χρησιμοποιείται για τις κατασκευές «if ... elif ... else», που δεν θα παρέχει την επιθυμητή απόδοση κατά την επεξεργασία πολύ μεγάλων συνόλων συγκρίσεων.

Πηγή: opennet.ru

Προσθέστε ένα σχόλιο