Python 3.10

Python 3.10.0 (final) a fost lansat pe 4 octombrie 2021. Caracteristicile pentru 3.10 sunt definite în PEP 619, iar o descriere detaliată a modificărilor poate fi găsită în Ce este nou în Python 3.10.

Caracteristici noi de sintaxă

Stare

PEP 634

Potrivire structurală de tipare: specificație

[1]

PEP 635

Potrivire structurală de tipare: motivație și justificare

[1]

PEP 636

Potrivire structurală de tipare: tutorial

[1]

bpo-12782

Gestionarele de context cu paranteze sunt acum permise oficial

Caracteristici noi în biblioteca standard

PEP 618

Adăugarea verificării opționale a lungimii la zip

Îmbunătățiri ale interpretorului

PEP 626

Numere de linie precise pentru depanare și alte instrumente

Caracteristici noi de tipizare

PEP 604

Permiterea scrierii tipurilor uniune sub forma X | Y

PEP 613

Alias-uri de tip explicite

PEP 612

Variabile de specificare a parametrilor

Deprecieri, eliminări sau restricții importante

PEP 644

Necesită OpenSSL 1.1.1 sau mai nou

PEP 632

Deprecierea modulului distutils.

Nu este relevant

PEP 623

Deprecierea și pregătirea pentru eliminarea membrului wstr din PyUnicodeObject.

Nu este relevant

PEP 624

Eliminarea API-urilor de codificare Py_UNICODE

Nu este relevant

PEP 597

Adăugarea unui EncodingWarning opțional

Alte modificări ale limbajului:

Tipul int are o nouă metodă int.bit_count(), care returnează numărul de biți de 1 din reprezentarea binară a unui întreg dat, cunoscut și ca numărul de populație (population count).

Vizualizările returnate de dict.keys(), dict.values() și dict.items() au acum toate un atribut mapping care oferă un obiect types.MappingProxyType ce încapsulează dicționarul original.

PEP 618: Funcția zip() are acum un indicator opțional strict, folosit pentru a impune ca toate iterabilele să aibă o lungime egală.

Funcțiile încorporate și cele de extensie care primesc argumente întregi nu mai acceptă obiecte Decimal, Fractionși alte obiecte care pot fi convertite în întregi doar cu pierderi (de exemplu, cele care au metoda __int__(), dar nu și metoda __index__()).

Dacă object.__ipow__() returnează NotImplemented, operatorul va reveni corect la object.__pow__() și object.__rpow__(), conform așteptărilor.

Expresiile de atribuire pot fi acum folosite fără paranteze în literalele de mulțimi și în comprehensiunile de mulțimi, precum și în indecșii de secvențe (dar nu și în felii).

Funcțiile au un nou atribut __builtins__ care este folosit pentru a căuta simbolurile încorporate atunci când o funcție este executată, în loc de a căuta în __globals__['__builtins__']. Atributul este inițializat din __globals__["__builtins__"] dacă există, altfel din funcțiile încorporate curente.

Au fost adăugate două noi funcții încorporate – aiter() și anext() – pentru a oferi echivalente asincrone pentru iter() și, respectiv, next().

Metodele statice (@staticmethod) și metodele de clasă (@classmethod) moștenesc acum atributele metodei (__module__, __name__, __qualname__, __doc__, __annotations__) și au un nou atribut __wrapped__. În plus, metodele statice pot fi acum apelate ca funcții obișnuite.

Adnotările pentru ținte complexe (orice în afară de țintele simple name definite de PEP 526) nu mai cauzează niciun efect la rulare atunci când se folosește from __future__ import annotations.

Obiectele de clasă și de modul creează acum în mod leneș dicționare de adnotări goale la cerere. Dicționarele de adnotări sunt stocate în __dict__ al obiectului pentru compatibilitate retroactivă. Acest lucru îmbunătățește bunele practici de lucru cu __annotations__.

Adnotările care conțin yield, yield from, await sau expresii cu nume sunt acum interzise sub from __future__ import annotations din cauza efectelor lor secundare.

Utilizarea variabilelor nelegate, a super() și a altor expresii care ar putea altera procesarea tabelului de simboluri ca adnotări nu mai are niciun efect sub from __future__ import annotations.

Codurile hash ale valorilor NaN, atât de tip float, cât și de tip decimal.Decimal, depind acum de identitatea obiectului. Anterior, acestea aveau întotdeauna codul hash 0, chiar dacă valorile NaN nu sunt egale între ele. Acest lucru cauza un comportament potențial pătratic la rulare din cauza coliziunilor excesive de hash la crearea de dicționare și mulțimi care conțin mai multe valori NaN.

O excepție SyntaxError (în loc de NameError) va fi generată la ștergerea constantei __debug__.

Excepțiile SyntaxError au acum atributele end_lineno și end_offset. Acestea vor fi None dacă nu sunt determinate.

Modificări ale modulelor încorporate:

asyncio

Adăugarea metodei lipsă connect_accepted_socket().

array

Metoda index() a clasei array.array are acum parametrii opționali start și stop.

gc

Adăugarea de hook-uri de audit pentru gc.get_objects(), gc.get_referrers() și gc.get_referents().

hashlib

Modulul hashlib necesită OpenSSL 1.1.1 sau mai nou.

Modulul hashlib are suport preliminar pentru OpenSSL 3.0.0.

Implementarea de rezervă pur-Python a pbkdf2_hmac() este depreciată. În viitor, PBKDF2-HMAC va fi disponibil doar atunci când Python a fost compilat cu suport OpenSSL.

os

Adăugarea suportului os.cpu_count() pentru VxWorks RTOS.

Adăugarea unei noi funcții os.eventfd() și a unor funcții auxiliare aferente pentru a încapsula apelul de sistem eventfd2 pe Linux.

Adăugarea funcției os.splice(), care permite mutarea datelor între doi descriptori de fișier fără copiere între spațiul de adrese al nucleului și spațiul de adrese al utilizatorului, unde unul dintre descriptorii de fișier trebuie să se refere la un pipe.

Adăugarea O_EVTONLY, O_FSYNC, O_SYMLINK și O_NOFOLLOW_ANY pentru macOS.

platform

Adăugarea platform.freedesktop_os_release() pentru a obține identificarea sistemului de operare din fișierul standard freedesktop.org os-release.

socket

Excepția socket.timeout este acum un alias al TimeoutError.

Adăugarea opțiunii de a crea socket-uri MPTCP cu IPPROTO_MPTCP.

Adăugarea opțiunii IP_RECVTOS pentru a primi câmpurile de tip de serviciu (ToS) sau DSCP/ECN.

ssl

Modulul ssl necesită OpenSSL 1.1.1 sau mai nou.

Modulul ssl are suport preliminar pentru OpenSSL 3.0.0 și o nouă opțiune OP_IGNORE_UNEXPECTED_EOF.

Funcțiile depreciate și utilizarea constantelor depreciate generează acum un DeprecationWarning. ssl.SSLContext.options are setate implicit OP_NO_SSLv2 și OP_NO_SSLv3 și, prin urmare, nu poate avertiza din nou despre setarea indicatorului.

Modulul ssl are acum setări implicite mai sigure. Cifrurile fără secretizare directă (forward secrecy) sau cu MAC SHA-1 sunt dezactivate implicit. Nivelul de securitate 2 interzice cheile RSA, DH și ECC slabe, cu mai puțin de 112 biți de securitate. SSLContext are ca valoare implicită versiunea minimă de protocol TLS 1.2. Setările se bazează pe cercetarea lui Hynek Schlawack.

Protocoalele depreciate SSL 3.0, TLS 1.0 și TLS 1.1 nu mai sunt suportate oficial. Python nu le blochează în mod activ. Totuși, opțiunile de compilare ale OpenSSL, configurațiile distribuțiilor, patch-urile furnizorilor și suitele de cifruri pot împiedica o negociere reușită.

Adăugarea unui parametru timeout la funcția ssl.get_server_certificate().

Modulul ssl folosește tipuri heap și inițializare în mai multe faze.

A fost adăugat un nou indicator de verificare VERIFY_X509_PARTIAL_CHAIN.

sys

Adăugarea atributului sys.orig_argv: lista argumentelor originale din linia de comandă transmise executabilului Python.

Adăugarea sys.stdlib_module_names, care conține lista numelor modulelor din biblioteca standard.

_thread

_thread.interrupt_main() primește acum un număr de semnal opțional de simulat (valoarea implicită este în continuare signal.SIGINT).

Note