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

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

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

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

Για παράδειγμα, είναι δυνατό να αποσυμπιεστούν αντικείμενα, πλειάδες, λίστες και αυθαίρετες ακολουθίες για τη σύνδεση μεταβλητών με βάση τις διαθέσιμες τιμές. Είναι δυνατό να ορίσετε ένθετα πρότυπα, να χρησιμοποιήσετε πρόσθετες συνθήκες "if" στο πρότυπο, να χρησιμοποιήσετε μάσκες ("[x, y, *rest]"), να αντιστοιχίσετε ζεύγη κλειδιών/τιμών (π.χ. {"bandwidth": b, "latency": l} για να εξαγάγετε τις τιμές "bandwidth" και "latency" και ένα λεξικό), να εξαγάγετε το σταθερό όνομα "te" (mplates) και να εξάγετε το σταθερό όνομα "te". Οι κλάσεις μπορούν να προσαρμόσουν τη συμπεριφορά αντιστοίχισης χρησιμοποιώντας τη μέθοδο "__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
χρώμα ταιριάσματος:
θήκη .ΚΟΚΚΙΝΟ:
εκτύπωση («Βλέπω κόκκινο!»)
περίπτωση .ΠΡΑΣΙΝΟ:
εκτύπωση ("Το γρασίδι είναι πράσινο")
θήκη .ΜΠΛΕ
E:
print ("Αισθάνομαι τα μπλουζ :(")

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

Πηγή: opennet.ru

Αγοράστε αξιόπιστη φιλοξενία για ιστότοπους με προστασία DDoS, διακομιστές VPS VDS 🔥 Αγοράστε αξιόπιστη φιλοξενία ιστοσελίδων με προστασία DDoS, διακομιστές VPS VDS | ProHoster