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

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

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

Μεταξύ προστέθηκε καινοτομίες στην Python 3.9:

  • Σε λεξικά που ορίζονται χρησιμοποιώντας την ενσωματωμένη κλάση 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().

    charType = Σχολιασμένο[int, ctype("char")] UnsignedShort = Σχολιασμένο[int, struct2.ctype('H')]

  • Μετριάστηκε γραμματικές απαιτήσεις για διακοσμητές - οποιαδήποτε έκφραση κατάλληλη για χρήση σε μπλοκ if and while μπορεί τώρα να χρησιμοποιηθεί ως διακοσμητής. Η αλλαγή βελτίωσε σημαντικά την αναγνωσιμότητα του κώδικα PyQt5 και απλοποίησε τη συντήρηση αυτής της ενότητας:

    Ήταν:
    button_0 = buttons[0] @button_0.clicked.connect

    Τώρα μπορείτε να γράψετε:
    @buttons[0].κλικ.σύνδεση

  • Στην τυπική βιβλιοθήκη προστέθηκε μονάδα zoneinfo, το οποίο περιλαμβάνει πληροφορίες από τη βάση δεδομένων ζώνης ώρας IANA.

    >>> από zoneinfo εισαγωγή ZoneInfo
    >>> από ημερομηνία ώρα εισαγωγής ημερομηνία ώρα, timedelta
    >>> # Θερινή ώρα
    >>> dt = ημερομηνία ώρας(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
    >>> εκτύπωση (dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'PDT'

    >>> # Τυπική ώρα
    >>> dt += timedelta(ημέρες=7)
    >>> εκτύπωση (dt)
    2020-11-07 12:00:00-08:00

    >>> print(dt.tzname())
    PST

  • Προστέθηκε μονάδα 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 έκδοση 3.4 3.5 3.6 3.7 3.8 3.9
    ———————————

    Πρόσβαση ανάγνωσης μεταβλητής και χαρακτηριστικού:
    read_local 7.1 7.1 5.4 5.1 3.9 4.0
    read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.8
    read_global 15.5 19.0 14.3 13.6 7.6 7.7
    read_builtin 21.1 21.6 18.5 19.0 7.5 7.7
    read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 18.6
    read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 20.1
    read_instancevar 32.4 33.1 28.0 26.3 25.4 27.7
    read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5
    read_namedtuple 73.8 57.5 ​​45.0 46.8 18.4 23.2
    read_boundmethod 37.6 37.9 29.6 26.9 27.7 45.9

    Πρόσβαση εγγραφής μεταβλητής και χαρακτηριστικού:
    write_local 8.7 9.3 5.5 5.3 4.3 4.2
    write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.9
    write_global 19.7 21.2 18.0 18.0 15.8 17.2
    write_classvar 92.9 96.0 104.6 102.1 39.2 43.2
    write_instancevar 44.6 45.8 40.0 38.9 35.5 40.7
    write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7

    Πρόσβαση ανάγνωσης δομής δεδομένων:
    read_list 24.2 24.5 20.8 20.8 19.0 21.1
    read_deque 24.7 25.5 20.2 20.6 19.8 21.6
    read_dict 24.3 25.7 22.3 23.0 21.0 22.5
    read_strdict 22.6 24.3 19.5 21.2 18.9 21.6

    Πρόσβαση εγγραφής στη δομή δεδομένων:
    write_list 27.1 28.5 22.5 21.6 20.0 21.6
    write_deque 28.7 30.1 22.7 21.8 23.5 23.2
    write_dict 31.4 33.3 29.3 29.2 24.7 27.8
    write_strdict 28.4 29.9 27.5 25.2 23.1 29.8

    Λειτουργίες στοίβας (ή ουράς):
    list_append_pop 93.4 112.7 75.4 74.2 50.8 53.9
    deque_append_pop 43.5 57.0 49.4 49.2 42.5 45.5
    deque_append_popleft 43.7 57.3 49.7 49.7 42.8 45.5

    Βρόχος χρονισμού:
    loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3

  • Καταργήθηκε πολλές συναρτήσεις και μέθοδοι 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().

Πηγή: opennet.ru

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