Κυκλοφορία της γλώσσας προγραμματισμού Python 3.11

Μετά από ένα χρόνο ανάπτυξης, δημοσιεύτηκε η σημαντική κυκλοφορία της γλώσσας προγραμματισμού Python 3.11. Ο νέος κλάδος θα υποστηρίζεται για ενάμιση χρόνο, μετά τον οποίο για άλλα τρεισήμισι χρόνια θα δημιουργηθούν διορθώσεις για την εξάλειψη των τρωτών σημείων.

Ταυτόχρονα, ξεκίνησε η άλφα δοκιμή του κλάδου Python 3.12 (σύμφωνα με το νέο πρόγραμμα ανάπτυξης, η εργασία σε ένα νέο κλάδο ξεκινά πέντε μήνες πριν από την κυκλοφορία του προηγούμενου κλάδου και φτάνει στο στάδιο άλφα δοκιμής μέχρι την επόμενη έκδοση ). Ο κλάδος Python 3.12 θα είναι σε κυκλοφορία alpha για επτά μήνες, κατά τους οποίους θα προστεθούν νέες δυνατότητες και θα διορθωθούν σφάλματα. Μετά από αυτό, οι εκδόσεις beta θα δοκιμαστούν για τρεις μήνες, κατά τους οποίους θα απαγορεύεται η προσθήκη νέων χαρακτηριστικών και θα δοθεί όλη η προσοχή στη διόρθωση σφαλμάτων. Τους τελευταίους δύο μήνες πριν από την κυκλοφορία, το υποκατάστημα θα βρίσκεται στο στάδιο της υποψήφιας κυκλοφορίας, στο οποίο θα γίνει η τελική σταθεροποίηση.

Οι νέες προσθήκες στην Python 3.11 περιλαμβάνουν:

  • Έχει γίνει σημαντική δουλειά για τη βελτιστοποίηση της απόδοσης. Ο νέος κλάδος περιλαμβάνει αλλαγές που σχετίζονται με την επιτάχυνση και την ενσωματωμένη επέκταση των κλήσεων συναρτήσεων, τη χρήση γρήγορων διερμηνέων για τυπικές λειτουργίες (x+x, x*x, xx, a[i], a[i] = z, f(arg) C(arg), o.method(), o.attr = z, *seq), καθώς και βελτιστοποιήσεις που προετοιμάστηκαν από τα έργα Cinder και HotPy. Ανάλογα με τον τύπο φορτίου, παρατηρείται αύξηση στην ταχύτητα εκτέλεσης κώδικα κατά 10-60%. Κατά μέσο όρο, η απόδοση κατά την επιτυχή ολοκλήρωση της σουίτας δοκιμών pyperformance αυξήθηκε κατά 25%.

    Ο μηχανισμός προσωρινής αποθήκευσης bytecode έχει επανασχεδιαστεί, γεγονός που έχει μειώσει τον χρόνο εκκίνησης του διερμηνέα κατά 10-15%. Τα αντικείμενα με κώδικα και bytecode πλέον κατανέμονται στατικά από τον διερμηνέα, γεγονός που κατέστησε δυνατή την εξάλειψη των σταδίων της αποσυναρμολόγησης bytecode που εξάγεται από την προσωρινή μνήμη και της μετατροπής αντικειμένων με κώδικα για τοποθέτηση σε δυναμική μνήμη.

  • Κατά την εμφάνιση ιχνών κλήσεων σε διαγνωστικά μηνύματα, εμφανίζονται πλέον πληροφορίες σχετικά με την έκφραση που προκάλεσε το σφάλμα (προηγουμένως, επισημαινόταν μόνο η γραμμή χωρίς να αναφέρεται λεπτομερώς ποιο μέρος της γραμμής προκαλούσε το σφάλμα). Εκτεταμένες πληροφορίες ιχνηλάτησης μπορούν επίσης να ληφθούν μέσω του API και να χρησιμοποιηθούν για την αντιστοίχιση μεμονωμένων οδηγιών bytecode σε μια συγκεκριμένη θέση στον πηγαίο κώδικα χρησιμοποιώντας τη μέθοδο codeobject.co_positions() ή τη συνάρτηση C API PyCode_Addr2Location(). Αυτή η αλλαγή απλοποιεί σημαντικά τα προβλήματα εντοπισμού σφαλμάτων που σχετίζονται με ένθετα αντικείμενα λεξικού, πολλαπλές κλήσεις συναρτήσεων και σύνθετες αριθμητικές εκφράσεις. Traceback (τελευταία κλήση): Αρχείο "calculation.py", γραμμή 54, στο αποτέλεσμα = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: διαίρεση με το μηδέν
  • Προστέθηκε υποστήριξη για ομάδες εξαιρέσεων, οι οποίες επιτρέπουν στο πρόγραμμα να δημιουργεί και να χειρίζεται πολλές διαφορετικές εξαιρέσεις ταυτόχρονα. Προτείνονται νέοι τύποι εξαιρέσεων ExceptionGroup και BaseExceptionGroup για την ομαδοποίηση πολλών εξαιρέσεων και την κοινή τους κλήση, και προστίθεται η έκφραση "except*" για την επιλογή μεμονωμένων εξαιρέσεων από μια ομάδα.
  • Η μέθοδος add_note() έχει προστεθεί στην κλάση BaseException, επιτρέποντάς σας να επισυνάψετε μια σημείωση κειμένου σε μια εξαίρεση, για παράδειγμα για να προσθέσετε πληροφορίες περιβάλλοντος που δεν ήταν διαθέσιμες όταν δημιουργήθηκε η εξαίρεση.
  • Προστέθηκε ένας ειδικός τύπος Self που αντιπροσωπεύει την τρέχουσα κλειστή κλάση. Ο Self μπορεί να χρησιμοποιηθεί για να σχολιάσει μεθόδους που επιστρέφουν μια παρουσία της κλάσης του, με απλούστερο τρόπο από τη χρήση του TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
  • Προστέθηκε ένας ειδικός τύπος LiteralString που μπορεί να περιέχει μόνο συμβολοσειρές συμβατές με τον τύπο LiteralString (δηλαδή, γυμνές συμβολοσειρές και συμβολοσειρές του τύπου LiteralString, αλλά όχι αυθαίρετες ή συνδυασμένες συμβολοσειρές str). Ο τύπος LiteralString μπορεί να χρησιμοποιηθεί για να περιορίσει τη μεταβίβαση ορισμάτων συμβολοσειράς σε συναρτήσεις όπου η αυθαίρετη αντικατάσταση τμημάτων συμβολοσειράς μπορεί να οδηγήσει σε ευπάθειες, για παράδειγμα, κατά τη δημιουργία συμβολοσειρών για ερωτήματα SQL ή εντολές shell. def run_query(sql: LiteralString) -> ... ... def caller( arbitrary_string: str, query_string: LiteralString, table_name: LiteralString, ) -> None: run_query("SELECT * FROM students") # ok run_query(literal_string) # ok run_query("SELECT * FROM " + literal_string) # ok run_query(arbitrary_string) # Error run_query( # Error f»SELECT * FROM students WHERE name = {arbitrary_string}» )
  • Προστέθηκε ο τύπος TypeVarTuple, ο οποίος επιτρέπει τη χρήση variadic generics, τα οποία, σε αντίθεση με το TypeVar, δεν καλύπτουν έναν τύπο, αλλά έναν αυθαίρετο αριθμό τύπων.
  • Η τυπική βιβλιοθήκη περιλαμβάνει τη λειτουργική μονάδα tomllib με συναρτήσεις για την ανάλυση της μορφής TOML.
  • Παρέχεται η δυνατότητα σήμανσης μεμονωμένων στοιχείων των πληκτρολογημένων λεξικών (TypedDict) με ετικέτες Required και NotRequired για τον ορισμό υποχρεωτικών και προαιρετικών πεδίων (από προεπιλογή, όλα τα δηλωμένα πεδία είναι υποχρεωτικά εκτός εάν η παράμετρος total έχει οριστεί σε False). class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {«title»: «Black Panther», «year»: 2018} # OK m2: Movie = {«title»: «Star Wars»} # OK (το πεδίο έτους είναι προαιρετικό) m3: Movie = {«year»: 2022} # Σφάλμα, το απαιτούμενο πεδίο τίτλου δεν έχει συμπληρωθεί)
  • Η κλάση TaskGroup έχει προστεθεί στη μονάδα asyncio, υλοποιώντας έναν διαχειριστή ασύγχρονου περιβάλλοντος που περιμένει την ολοκλήρωση μιας ομάδας εργασιών. Οι εργασίες προστίθενται στην ομάδα χρησιμοποιώντας τη μέθοδο create_task(). async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(…)) task2 = tg.create_task(another_coro(…)) print(«Και οι δύο εργασίες έχουν ολοκληρωθεί τώρα.»)
  • Προστέθηκε ένας διακοσμητής για κλάσεις, μεθόδους και συναρτήσεις @dataclass_transform, ο οποίος, όταν καθορίζεται, προκαλεί το σύστημα στατικού ελέγχου τύπων να αντιμετωπίζει το αντικείμενο σαν να χρησιμοποιεί τον διακοσμητή @dataclasses.dataclass. Στο παρακάτω παράδειγμα, η κλάση CustomerModel θα αντιμετωπίζεται κατά τον έλεγχο τύπου με τον ίδιο τρόπο όπως μια κλάση με τον διακοσμητή @dataclasses.dataclass, δηλαδή σαν να έχει μια μέθοδο __init__ που επιτρέπει τις μεταβλητές id και name. @dataclass_transform() class ModelBase: … class CustomerModel(ModelBase): id: int name: str
  • Οι κανονικές εκφράσεις υποστηρίζουν πλέον ατομική ομαδοποίηση ((?>…)) και κτητικούς ποσοδείκτες (*+, ++, ?+, {m,n}+).
  • Προστέθηκε η επιλογή γραμμής εντολών "-P" και η μεταβλητή περιβάλλοντος PYTHONSAFEPATH για την απενεργοποίηση της αυτόματης προσάρτησης πιθανώς μη ασφαλών διαδρομών αρχείων στο sys.path.
  • Το βοηθητικό πρόγραμμα py.exe για την πλατφόρμα έχει βελτιωθεί σημαντικά. Windows, το οποίο υλοποιεί υποστήριξη για τη σύνταξη "-V:". / "εκτός από"- . ".
  • Πολλές μακροεντολές στο C API έχουν μετατραπεί σε κανονικές ή στατικές ενσωματωμένες συναρτήσεις.
  • Οι ενότητες uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev και sunau έχουν καταργηθεί και θα αφαιρεθούν στην Python 3.13. Οι συναρτήσεις PyUnicode_Encode* έχουν αφαιρεθεί.

Πηγή: opennet.ru

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