Μετά από ένα χρόνο ανάπτυξης παρουσιάζονται σημαντική έκδοση γλώσσας προγραμματισμού Python 3.9. Η Python 3.9 ήταν η πρώτη κυκλοφορία μετά μετάβαση έργο σε νέος κύκλος προετοιμασία και υποστήριξη εκδόσεων. Οι νέες σημαντικές εκδόσεις θα δημιουργούνται πλέον μία φορά το χρόνο και οι διορθωτικές ενημερώσεις θα κυκλοφορούν κάθε δύο μήνες. Κάθε σημαντικός κλάδος θα υποστηρίζεται για ενάμιση χρόνο, μετά τον οποίο θα αναπτυχθούν άλλα τρεισήμισι χρόνια για να διορθωθούν ευπάθειες.
Οι εργασίες σε ένα νέο υποκατάστημα ξεκινούν τώρα πέντε μήνες πριν από την κυκλοφορία του επόμενου κλάδου, δηλ. που συμπίπτει με την κυκλοφορία της Python 3.9 άρχισε άλφα δοκιμή του κλάδου Python 3.10. Ο κλάδος Python 3.10 θα είναι σε κυκλοφορία alpha για επτά μήνες, κατά τους οποίους θα προστεθούν νέες δυνατότητες και θα διορθωθούν σφάλματα. Μετά από αυτό, οι εκδόσεις beta θα δοκιμαστούν για τρεις μήνες, κατά τους οποίους θα απαγορεύεται η προσθήκη νέων χαρακτηριστικών και θα δοθεί όλη η προσοχή στη διόρθωση σφαλμάτων. Τους τελευταίους δύο μήνες πριν από την κυκλοφορία, το υποκατάστημα θα βρίσκεται στο στάδιο της υποψήφιας κυκλοφορίας, στο οποίο θα γίνει η τελική σταθεροποίηση.
Σε λεξικά που ορίζονται χρησιμοποιώντας την ενσωματωμένη κλάση dict, εμφανίστηκε υποστήριξη για τελεστές συγχώνευσης "|" και "|=" ενημερώσεις, οι οποίες συμπληρώνουν τις μεθόδους {**d1, **d2} και dict.update που προτάθηκαν προηγουμένως για τη συγχώνευση λεξικών.
>>> x = {"key1": "value1 from x", "key2": "value2 from x"}
>>> y = {"key2": "value2 from y", "key3": "value3 from y"}
>>> x | y
{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
>>> y | Χ
{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}
Η ενσωματωμένη συλλογή τύπων περιλαμβάνει λίστα, dict και πλειάδα, τα οποία μπορούν να χρησιμοποιηθούν ως βασικοί τύποι χωρίς εισαγωγή από τη μονάδα πληκτρολόγησης. Εκείνοι. αντί για πληκτρολόγηση.Λίστα, πληκτρολόγηση.Dict και πληκτρολόγηση.Διπλός μπορείτε τώρα να καθορίσετε
απλά απαριθμήστε, υπαγορεύστε και πληθωρίστε:
def greet_all(names: list[str]) -> None:
για όνομα σε ονόματα:
print ("Hello", όνομα)
ΠΑΡΕΧΟΝΤΑΙ ευέλικτα εργαλεία για σχολιασμό συναρτήσεων και μεταβλητών. Για την επισύναψη σχολιασμών, ένας νέος τύπος Annotated προστέθηκε στη μονάδα πληκτρολόγησης, επεκτείνοντας τους υπάρχοντες τύπους με πρόσθετα μεταδεδομένα που μπορούν να χρησιμοποιηθούν για στατική ανάλυση ή για βελτιστοποιήσεις χρόνου εκτέλεσης. Για πρόσβαση στα μεταδεδομένα από κώδικα, η παράμετρος include_extras έχει προστεθεί στη μέθοδο typing.get_type_hints().
Μετριάστηκε γραμματικές απαιτήσεις για διακοσμητές - οποιαδήποτε έκφραση κατάλληλη για χρήση σε μπλοκ if and while μπορεί τώρα να χρησιμοποιηθεί ως διακοσμητής. Η αλλαγή βελτίωσε σημαντικά την αναγνωσιμότητα του κώδικα PyQt5 και απλοποίησε τη συντήρηση αυτής της ενότητας:
Προστέθηκε μονάδα graphlib, στην οποία εφαρμόστηκε υποστήριξη για τοπολογική ταξινόμηση γραφημάτων.
Προτάθηκε νέες μέθοδοι για την αφαίρεση προθεμάτων και καταλήξεων γραμμών - str.removeprefix(πρόθεμα) και str.removesuffix(κατάληξη). Μέθοδοι έχουν προστεθεί σε str, byte, bytearray και collections.UserString αντικείμενα.
>>> s = "FooBar"
>>> s.removeprefix("Foo")
'Μπαρ'
Εμπλεγμένος νέος αναλυτής PEG (Parsing Expression Grammar), που αντικατέστησε τον αναλυτή LL(1). Η χρήση του νέου αναλυτή κατέστησε δυνατή την εξάλειψη ορισμένων από τα «hacks» που χρησιμοποιούνται για την παράκαμψη των περιορισμών στο LL(1) και μείωσε σημαντικά το κόστος εργασίας για τη συντήρηση του αναλυτή. Όσον αφορά την απόδοση, ο νέος αναλυτής βρίσκεται περίπου στο ίδιο επίπεδο με τον προηγούμενο, αλλά είναι πολύ πιο μπροστά του όσον αφορά την ευελιξία, γεγονός που σας επιτρέπει να αισθάνεστε πιο ελεύθεροι όταν σχεδιάζετε νέες δυνατότητες γλώσσας. Ο παλιός κωδικός ανάλυσης διατηρείται προς το παρόν και μπορεί να επιστραφεί χρησιμοποιώντας τη σημαία "-X oldparser" ή τη μεταβλητή περιβάλλοντος "PYTHONOLDPARSER=1", αλλά θα καταργηθεί στην έκδοση 3.10.
Υπό την προϋπόθεση τη δυνατότητα των μεθόδων επέκτασης C να έχουν πρόσβαση στην κατάσταση των λειτουργικών μονάδων στις οποίες έχουν οριστεί χρησιμοποιώντας άμεση αποαναφορά δείκτη αντί να αναζητούν την κατάσταση της μονάδας χρησιμοποιώντας τη συνάρτηση PyState_FindModule. Η αλλαγή σάς επιτρέπει να αυξήσετε την απόδοση των λειτουργικών μονάδων C μειώνοντας ή εξαλείφοντας εντελώς τα γενικά έξοδα ελέγχου της κατάστασης της μονάδας. Για να συσχετίσετε μια λειτουργική μονάδα με μια κλάση, προτείνεται η συνάρτηση C PyType_FromModuleAndSpec(), για να λάβετε τη λειτουργική μονάδα και την κατάστασή της, προτείνονται οι συναρτήσεις C PyType_GetModule() και PyType_GetModuleState() και για να παρέχεται μια μέθοδος με πρόσβαση στην κλάση στο οποίο ορίζεται, προτείνεται η συνάρτηση C PyCMethod και η σημαία METH_METHOD. .
Συλλέκτης σκουπιδιών παραδόθηκε από το κλείδωμα των συλλογών που περιέχουν ανανεωμένα αντικείμενα που παραμένουν εξωτερικά προσβάσιμα μετά την εκτέλεση του τελικού προγράμματος.
Προστέθηκε μέθοδος os.pidfd_open, το οποίο επιτρέπει στο υποσύστημα πυρήνα Linux "pidfd" να χρησιμοποιείται για τον χειρισμό της κατάστασης επαναχρησιμοποίησης PID (το pidfd σχετίζεται με μια συγκεκριμένη διαδικασία και δεν αλλάζει, ενώ ένα PID μπορεί να συσχετιστεί με μια άλλη διαδικασία μετά τον τερματισμό της τρέχουσας διεργασίας που σχετίζεται με αυτό το PID ).
Η υποστήριξη για την προδιαγραφή Unicode έχει ενημερωθεί στην έκδοση 13.0.0.
Αποκλείστηκε έλλειψη μνήμης κατά την επανεκκίνηση του διερμηνέα Python στην ίδια διαδικασία.
Η απόδοση του ενσωματωμένου εύρους τύπων, πλειάδας, σετ, παγωμένης ρύθμισης, λίστας και εντολών έχει βελτιστοποιηθεί. εφαρμόστηκε μέσω της χρήσης του πρωτοκόλλου συντόμευσης Vectorcall για ταχύτερη πρόσβαση σε αντικείμενα γραμμένα στη γλώσσα C.
Οι ενότητες _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time και _weakref έχουν μετακινηθεί στη φόρτωση από αρχικοποίηση σε διάφορα στάδια.
Οι τυπικές ενότητες βιβλιοθήκης audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios και zlib έχουν μετατραπεί σε περιορισμένη χρήση σταθερό ABI, το οποίο λύνει το πρόβλημα της λειτουργικότητας των συγκροτημάτων μονάδων επέκτασης για διαφορετικές εκδόσεις της Python (κατά την ενημέρωση της έκδοσης, δεν χρειάζεται να ξαναδημιουργηθούν μονάδες επέκτασης και οι μονάδες που έχουν μεταγλωττιστεί για το 3.9 θα μπορούν να λειτουργούν στον κλάδο 3.10).
Η λειτουργική μονάδα asyncio έχει καταργήσει την υποστήριξη για την παράμετρο reuse_address λόγω πιθανών ζητημάτων ασφαλείας (η χρήση του SO_REUSEADDR για UDP στο Linux επιτρέπει σε διαφορετικές διεργασίες να προσαρτούν υποδοχές ακρόασης σε μια θύρα UDP).
Έχουν προστεθεί νέες βελτιστοποιήσεις, για παράδειγμα, βελτιωμένη απόδοση των χειριστών σήματος σε εφαρμογές πολλαπλών νημάτων, αυξημένη ταχύτητα της μονάδας υποδιεργασίας στο περιβάλλον FreeBSD και ταχύτερη εκχώρηση προσωρινών μεταβλητών (αναθέτοντας μια μεταβλητή στην έκφραση "for y στο [expr ]” είναι πλέον τόσο αποδοτική όσο η έκφραση "y = expr" "). Γενικά, τα περισσότερα τεστ δείχνουν μείωση απόδοσης σε σύγκριση με τον κλάδο 3.8 (η επιτάχυνση παρατηρείται μόνο στις δοκιμές write_local και write_deque):
Καταργήθηκε πολλές συναρτήσεις και μέθοδοι Python 2.7 που είχαν καταργηθεί προηγουμένως και είχαν ως αποτέλεσμα ένα DeprecationWarning στην προηγούμενη έκδοση, συμπεριλαμβανομένης της μεθόδου unescape() στο html.parser.HTMLParser,
tostring() και fromstring() στο array.array, isAlive() στο threading.Thread, getchildren() και getiterator() στο ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() και base64.decodestring().