Python 3.10

Python 3.10.0 (finale) e” stato rilasciato il 4 ottobre 2021. Le funzionalita” della 3.10 sono definite in PEP 619 e una descrizione dettagliata delle modifiche e” disponibile in What’s New in Python 3.10.

Nuove funzionalita” di sintassi

Stato

PEP 634

Structural Pattern Matching: Specification

[1]

PEP 635

Structural Pattern Matching: Motivation and Rationale

[1]

PEP 636

Structural Pattern Matching: Tutorial

[1]

bpo-12782

I context manager tra parentesi sono ora ufficialmente consentiti

Nuove funzionalita” nella libreria standard

PEP 618

Aggiunta del controllo opzionale della lunghezza a zip

Miglioramenti dell’interprete

PEP 626

Numeri di riga precisi per il debugging e altri strumenti

Nuove funzionalita” di tipizzazione

PEP 604

Possibilita” di scrivere i tipi union come X | Y

PEP 613

Alias di tipo espliciti

PEP 612

Variabili di specifica dei parametri

Deprecazioni, rimozioni o restrizioni importanti

PEP 644

Richiesta di OpenSSL 1.1.1 o successivo

PEP 632

Deprecazione del modulo distutils.

Non rilevante

PEP 623

Deprecazione e preparazione alla rimozione del membro wstr in PyUnicodeObject.

Non rilevante

PEP 624

Rimozione delle API di codifica Py_UNICODE

Non rilevante

PEP 597

Aggiunta dell’EncodingWarning opzionale

Altre modifiche al linguaggio:

Il tipo int dispone di un nuovo metodo int.bit_count(), che restituisce il numero di uni nell’espansione binaria di un dato intero, noto anche come population count.

Le viste restituite da dict.keys(), dict.values() e dict.items() ora hanno tutte un attributo mapping che fornisce un oggetto types.MappingProxyType che incapsula il dizionario originale.

PEP 618: La funzione zip() ora dispone di un flag opzionale strict, usato per richiedere che tutti gli iterabili abbiano la stessa lunghezza.

Le funzioni builtin e di estensione che accettano argomenti interi non accettano piu” Decimal, Fractione altri oggetti che possono essere convertiti in interi solo con una perdita (ad esempio quelli che hanno il metodo __int__() ma non hanno il metodo __index__()).

Se object.__ipow__() restituisce NotImplemented, l’operatore ricadra” correttamente su object.__pow__() e object.__rpow__() come previsto.

Le espressioni di assegnamento possono ora essere usate senza parentesi all’interno dei literal di set e delle comprehension di set, nonche” negli indici di sequenza (ma non negli slice).

Le funzioni hanno un nuovo attributo __builtins__ che viene usato per cercare i simboli builtin quando una funzione viene eseguita, invece di cercare in __globals__['__builtins__']. L’attributo viene inizializzato da __globals__["__builtins__"] se esiste, altrimenti dai builtin correnti.

Sono state aggiunte due nuove funzioni builtin – aiter() e anext() – per fornire le controparti asincrone di iter() e next(), rispettivamente.

I metodi statici (@staticmethod) e i metodi di classe (@classmethod) ora ereditano gli attributi del metodo (__module__, __name__, __qualname__, __doc__, __annotations__) e hanno un nuovo attributo __wrapped__. Inoltre, i metodi statici sono ora chiamabili come normali funzioni.

Le annotazioni per target complessi (tutto cio” che esula dai target simple name definiti dalla PEP 526) non causano piu” alcun effetto a runtime con from __future__ import annotations.

Gli oggetti classe e modulo ora creano in modo lazy dizionari di annotazioni vuoti su richiesta. I dizionari di annotazioni sono memorizzati nel __dict__ dell’oggetto per compatibilita” all’indietro. Cio” migliora le best practice per lavorare con __annotations__.

Le annotazioni costituite da yield, yield from, await o named expression sono ora vietate con from __future__ import annotations a causa dei loro effetti collaterali.

L’uso di variabili non vincolate, di super() e di altre espressioni che potrebbero alterare l’elaborazione della tabella dei simboli come annotazioni e” ora reso privo di effetti con from __future__ import annotations.

Gli hash dei valori NaN sia del tipo float sia del tipo decimal.Decimal dipendono ora dall’identita” dell’oggetto. In precedenza, restituivano sempre un hash pari a 0 anche se i valori NaN non sono uguali tra loro. Cio” causava un comportamento a runtime potenzialmente quadratico a causa di eccessive collisioni di hash durante la creazione di dizionari e set contenenti piu” NaN.

Verra” sollevata un’eccezione SyntaxError (invece di NameError) quando si elimina la costante __debug__.

Le eccezioni SyntaxError ora hanno gli attributi end_lineno e end_offset. Saranno None se non determinati.

Modifiche ai moduli builtin:

asyncio

Aggiunta del metodo mancante connect_accepted_socket().

array

Il metodo index() di array.array ora dispone dei parametri opzionali start e stop.

gc

Aggiunta di audit hook per gc.get_objects(), gc.get_referrers() e gc.get_referents().

hashlib

Il modulo hashlib richiede OpenSSL 1.1.1 o successivo.

Il modulo hashlib ha un supporto preliminare per OpenSSL 3.0.0.

Il fallback in puro Python di pbkdf2_hmac() e” deprecato. In futuro PBKDF2-HMAC sara” disponibile solo quando Python e” stato compilato con il supporto OpenSSL.

os

Aggiunta del supporto a os.cpu_count() per VxWorks RTOS.

Aggiunta di una nuova funzione os.eventfd() e dei relativi helper per incapsulare la syscall eventfd2 su Linux.

Aggiunta di os.splice() che consente di spostare dati tra due descrittori di file senza copiare tra lo spazio di indirizzi del kernel e lo spazio di indirizzi utente, dove uno dei descrittori di file deve riferirsi a una pipe.

Aggiunta di O_EVTONLY, O_FSYNC, O_SYMLINK e O_NOFOLLOW_ANY per macOS.

platform

Aggiunta di platform.freedesktop_os_release() per recuperare l’identificazione del sistema operativo dal file standard freedesktop.org os-release.

socket

L’eccezione socket.timeout e” ora un alias di TimeoutError.

Aggiunta dell’opzione per creare socket MPTCP con IPPROTO_MPTCP.

Aggiunta dell’opzione IP_RECVTOS per ricevere i campi type of service (ToS) o DSCP/ECN.

ssl

Il modulo ssl richiede OpenSSL 1.1.1 o successivo.

Il modulo ssl ha un supporto preliminare per OpenSSL 3.0.0 e una nuova opzione OP_IGNORE_UNEXPECTED_EOF.

Le funzioni deprecate e l’uso di costanti deprecate ora generano un DeprecationWarning. ssl.SSLContext.options ha OP_NO_SSLv2 e OP_NO_SSLv3 impostati per impostazione predefinita e pertanto non puo” avvisare circa il reimpostarne il flag.

Il modulo ssl ha ora impostazioni predefinite piu” sicure. Le cipher prive di forward secrecy o con MAC SHA-1 sono disabilitate per impostazione predefinita. Il livello di sicurezza 2 vieta le chiavi RSA, DH ed ECC deboli con meno di 112 bit di sicurezza. SSLContext adotta per impostazione predefinita la versione minima del protocollo TLS 1.2. Le impostazioni si basano sulla ricerca di Hynek Schlawack.

I protocolli deprecati SSL 3.0, TLS 1.0 e TLS 1.1 non sono piu” ufficialmente supportati. Python non li blocca attivamente. Tuttavia le opzioni di compilazione di OpenSSL, le configurazioni della distro, le patch del fornitore e le cipher suite possono impedire un handshake riuscito.

Aggiunta di un parametro timeout alla funzione ssl.get_server_certificate().

Il modulo ssl utilizza heap-type e inizializzazione multi-fase.

E” stato aggiunto un nuovo flag di verifica VERIFY_X509_PARTIAL_CHAIN.

sys

Aggiunta dell’attributo sys.orig_argv: la lista degli argomenti originali della riga di comando passati all’eseguibile Python.

Aggiunta di sys.stdlib_module_names, contenente la lista dei nomi dei moduli della libreria standard.

_thread

_thread.interrupt_main() ora accetta un numero di segnale opzionale da simulare (il valore predefinito e” ancora signal.SIGINT).

Note