Rilascio del linguaggio di programmazione Python 3.9
Dopo un anno di sviluppo presentata rilascio significativo del linguaggio di programmazione Python 3.9. Python 3.9 è stata la prima versione successiva transizione progetto su nuovo ciclo preparazione e supporto dei rilasci. Le nuove versioni principali verranno ora generate una volta all'anno e gli aggiornamenti correttivi verranno rilasciati ogni due mesi. Ciascun ramo significativo sarà supportato per un anno e mezzo, dopodiché verranno sviluppati altri tre anni e mezzo per correggere le vulnerabilità.
I lavori su un nuovo ramo iniziano ora cinque mesi prima del rilascio del ramo successivo, ovvero in concomitanza con il rilascio di Python 3.9 iniziato test alpha del ramo Python 3.10. Il ramo Python 3.10 sarà in versione alpha per sette mesi, durante i quali verranno aggiunte nuove funzionalità e risolti bug. Successivamente, le versioni beta verranno testate per tre mesi, durante i quali sarà vietata l'aggiunta di nuove funzionalità e tutta l'attenzione sarà prestata alla correzione dei bug. Negli ultimi due mesi prima del rilascio, il ramo sarà nella fase di candidatura al rilascio, nella quale verrà eseguita la stabilizzazione finale.
Nei dizionari definiti utilizzando la classe dict incorporata, apparso supporto per gli operatori di unione "|" e "|=" aggiornamenti, che completano i metodi {**d1, **d2} e dict.update precedentemente proposti per unire i dizionari.
>>> x = {"chiave1": "valore1 da x", "chiave2": "valore2 da x"}
>>> y = {"chiave2": "valore2 da y", "chiave3": "valore3 da y"}
>>>x| sì
{'key1': 'valore1 da x', 'key2': 'valore2 da y', 'key3': 'valore3 da y'}
>>> e | X
{'key2': 'valore2 da x', 'key3': 'valore3 da y', 'key1': 'valore1 da x'}
La raccolta di tipi incorporata include list, dict e tuple, che possono essere utilizzati come tipi di base senza importarli dal modulo di digitazione. Quelli. invece di digitare.List, digitare.Dict e digitare.Tuple ora puoi specificare
basta elencare, dict e tupla:
def saluta_tutti(nomi: lista[str]) -> Nessuno:
per nome nei nomi:
print("Ciao", nome)
Sono forniti strumenti flessibili per annotare funzioni e variabili. Per allegare annotazioni, è stato aggiunto un nuovo tipo Annotato al modulo di digitazione, estendendo i tipi esistenti con metadati aggiuntivi che possono essere utilizzati per l'analisi statica o per ottimizzazioni in fase di esecuzione. Per accedere ai metadati dal codice, il parametro include_extras è stato aggiunto al metodo typeing.get_type_hints().
Tonificato requisiti grammaticali per i decoratori: qualsiasi espressione adatta all'uso nei blocchi if e while ora può essere utilizzata come decoratore. La modifica ha migliorato significativamente la leggibilità del codice PyQt5 e ha semplificato la manutenzione di questo modulo:
Aggiunto il modulo graphlib, in cui implementato supporto per l'ordinamento topologico dei grafici.
Proposto nuovi metodi per rimuovere prefissi e terminazioni di riga: str.removeprefix(prefix) e str.removesuffix(suffix). Sono stati aggiunti metodi agli oggetti str, bytes, bytearray ecollections.UserString.
>>> s = "FooBar"
>>> s.removeprefix("Pippo")
'Sbarra'
Coinvolto nuovo analizzatore PEG (Parsing Expression Grammar), che ha sostituito il parser LL(1). L'uso del nuovo parser ha reso possibile l'eliminazione di alcuni degli "hack" utilizzati per aggirare le restrizioni in LL(1) e ha ridotto significativamente i costi di manodopera per la manutenzione del parser. In termini di prestazioni, il nuovo parser è approssimativamente allo stesso livello del precedente, ma è significativamente più avanti in termini di flessibilità, il che ti consente di sentirti più libero durante la progettazione di nuove funzionalità linguistiche. Il vecchio codice del parser per ora viene mantenuto e può essere restituito utilizzando il flag "-X oldparser" o la variabile d'ambiente "PYTHONOLDPARSER=1", ma verrà rimosso nella versione 3.10.
Fornito da la possibilità per i metodi di estensione C di accedere allo stato dei moduli in cui sono definiti utilizzando il dereferenziamento diretto del puntatore invece di cercare lo stato del modulo utilizzando la funzione PyState_FindModule. La modifica consente di aumentare le prestazioni dei moduli C riducendo o eliminando completamente il sovraccarico derivante dal controllo dello stato del modulo. Per associare un modulo ad una classe viene proposta la funzione C PyType_FromModuleAndSpec(), per ottenere il modulo e il suo stato vengono proposte le funzioni C PyType_GetModule() e PyType_GetModuleState() e per fornire un metodo con accesso alla classe in cui viene definito vengono proposti la funzione C PyCMethod e il flag METH_METHOD.
Netturbino consegnato dal blocco delle raccolte contenenti oggetti rianimati che rimangono accessibili dall'esterno dopo l'esecuzione del finalizzatore.
Metodo aggiunto os.pidfd_open, che consente al sottosistema del kernel Linux "pidfd" di essere utilizzato per gestire la situazione di riutilizzo del PID (pidfd è associato a un processo specifico e non cambia, mentre un PID può essere associato a un altro processo dopo che il processo corrente associato a quel PID termina ).
Il supporto per la specifica Unicode è stato aggiornato alla versione 13.0.0.
Eliminato perdita di memoria quando si reinizializza l'interprete Python nello stesso processo.
Le prestazioni dei tipi integrati range, tuple, set, frozenset, list e dict sono state ottimizzate. implementato attraverso l'utilizzo del protocollo shortcut Vectorcall per un accesso più rapido agli oggetti scritti in linguaggio C.
I moduli _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, Resource, time e _weakref vengono caricati da inizializzazione in più fasi.
I moduli della libreria standard audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios e zlib sono stati convertiti per un utilizzo limitato ABI stabile, che risolve il problema dell'operabilità degli assiemi di moduli di estensione per diverse versioni di Python (quando si aggiorna la versione, non è necessario ricostruire i moduli di estensione e i moduli compilati per 3.9 potranno funzionare nel ramo 3.10).
Il modulo asyncio ha deprecato il supporto per il parametro reuse_address a causa di potenziali problemi di sicurezza (l'utilizzo di SO_REUSEADDR per UDP su Linux consente a diversi processi di collegare socket di ascolto a una porta UDP).
Sono state aggiunte nuove ottimizzazioni, ad esempio, prestazioni migliorate dei gestori di segnale nelle applicazioni multi-thread, maggiore velocità del modulo sottoprocesso nell'ambiente FreeBSD e un'assegnazione più rapida di variabili temporanee (assegnando una variabile nell'espressione “for y in [expr ]” è ora performante quanto l’espressione “y = expr” "). In generale, la maggior parte dei test spettacolo diminuzione delle prestazioni rispetto al ramo 3.8 (la velocità si osserva solo nei test write_local e write_deque):
Ciclo di temporizzazione:
loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3
RIMOSSO molte funzioni e metodi Python 2.7 che erano precedentemente deprecati e risultavano in un DeprecationWarning nella versione precedente, incluso il metodo unescape() in html.parser.HTMLParser,
tostring() e fromstring() in array.array, isAlive() in threading.Thread, getchildren() e getiterator() in ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() e base64.decodestring().