Κυκλοφορία της γλώσσας προγραμματισμού 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 που εξήχθη από τη μνήμη cache και μετατροπής αντικειμένων με κώδικα που θα τοποθετηθούν στη δυναμική μνήμη.

  • Κατά την εμφάνιση ιχνών κλήσεων σε διαγνωστικά μηνύματα, είναι πλέον δυνατή η εμφάνιση πληροφοριών σχετικά με την έκφραση που προκάλεσε το σφάλμα (προηγουμένως, μόνο η γραμμή επισημάνθηκε χωρίς να διευκρινιστεί ποιο τμήμα της γραμμής προκάλεσε το σφάλμα). Οι πληροφορίες εκτεταμένου ίχνους μπορούν επίσης να ληφθούν μέσω του API και να χρησιμοποιηθούν για την αντιστοίχιση μεμονωμένων εντολών bytecode σε μια συγκεκριμένη θέση στον πηγαίο κώδικα χρησιμοποιώντας τη μέθοδο codeobject.co_positions() ή τη συνάρτηση C API PyCode_Addr2Location(). Η αλλαγή καθιστά πολύ πιο εύκολο τον εντοπισμό σφαλμάτων προβλημάτων με ένθετα αντικείμενα λεξικού, πολλαπλές κλήσεις συναρτήσεων και σύνθετες αριθμητικές εκφράσεις. Ανίχνευση (πιο πρόσφατη τελευταία κλήση): Αρχείο "calculation.py", γραμμή 54, ως αποτέλεσμα = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: διαίρεση με μηδέν
  • Προστέθηκε υποστήριξη για ομάδες εξαιρέσεων, δίνοντας στο πρόγραμμα τη δυνατότητα να δημιουργεί και να επεξεργάζεται πολλές διαφορετικές εξαιρέσεις ταυτόχρονα. Για να ομαδοποιήσετε πολλές εξαιρέσεις και να τις αυξήσετε μαζί, έχουν προταθεί νέοι τύποι εξαιρέσεων ExceptionGroup και BaseExceptionGroup και η έκφραση "except*" προστέθηκε για να τονίσει μεμονωμένες εξαιρέσεις από μια ομάδα.
  • Η μέθοδος add_note() έχει προστεθεί στην κλάση BaseException, επιτρέποντάς σας να επισυνάψετε μια σημείωση κειμένου στην εξαίρεση, για παράδειγμα, προσθέτοντας πληροφορίες με βάση τα συμφραζόμενα που δεν είναι διαθέσιμες όταν γίνεται η εξαίρεση.
  • Προστέθηκε ένας ειδικός τύπος Self για να αντιπροσωπεύει την τρέχουσα ιδιωτική τάξη. Το Self μπορεί να χρησιμοποιηθεί για τον σχολιασμό μεθόδων που επιστρέφουν μια παρουσία της κλάσης του με απλούστερο τρόπο από τη χρήση του TypeVar. κλάση MyLock: def __enter__(self) -> Self: self.lock() return self
  • Προστέθηκε ένας ειδικός τύπος LiteralString που μπορεί να περιλαμβάνει μόνο γράμματα συμβολοσειράς που είναι συμβατά με τον τύπο LiteralString (δηλαδή, γυμνές και LiteralString συμβολοσειρές, αλλά όχι αυθαίρετες ή συνδυασμένες συμβολοσειρές). Ο τύπος LiteralString μπορεί να χρησιμοποιηθεί για τον περιορισμό της μετάδοσης ορισμάτων συμβολοσειρών σε συναρτήσεις, την αυθαίρετη αντικατάσταση τμημάτων συμβολοσειρών στα οποία μπορεί να οδηγήσει σε τρωτά σημεία, για παράδειγμα, κατά τη δημιουργία συμβολοσειρών για ερωτήματα SQL ή εντολές φλοιού. 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 student WHERE name = {arbitrary_string}" )
  • Ο τύπος TypeVarTuple έχει προστεθεί, επιτρέποντας τη χρήση γενικών μεταβλητών, σε αντίθεση με το TypeVar, που καλύπτουν όχι έναν τύπο, αλλά έναν αυθαίρετο αριθμό τύπων.
  • Η τυπική βιβλιοθήκη περιλαμβάνει τη λειτουργική μονάδα tomllib με λειτουργίες για την ανάλυση της μορφής TOML.
  • Είναι δυνατή η επισήμανση μεμονωμένων στοιχείων δακτυλογραφημένων λεξικών (TypedDict) με τις ετικέτες Required και NotRequired για τον προσδιορισμό των υποχρεωτικών και προαιρετικών πεδίων (από προεπιλογή, όλα τα δηλωμένα πεδία απαιτούνται εάν η συνολική παράμετρος δεν έχει οριστεί σε False). class Ταινία(TypedDict): τίτλος: str έτος: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars" } # OK (το πεδίο έτους είναι προαιρετικό) m3: Ταινία = {“έτος”: 2022} # Σφάλμα, το απαιτούμενο πεδίο τίτλου δεν έχει συμπληρωθεί)
  • Η κλάση TaskGroup έχει προστεθεί στη λειτουργική μονάδα asyncio με την εφαρμογή ενός ασύγχρονου διαχειριστή περιβάλλοντος που περιμένει να ολοκληρωθεί μια ομάδα εργασιών. Η προσθήκη εργασιών σε μια ομάδα γίνεται χρησιμοποιώντας τη μέθοδο create_task(). async def main(): async με asyncio.TaskGroup() ως 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 έχουν καταργηθεί και θα αφαιρεθούν στο 3.13 έκδοση. Καταργήθηκαν οι συναρτήσεις PyUnicode_Encode*.

Πηγή: opennet.ru

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