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.

Tra aggiunto innovazioni in Python 3.9:

  • 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().

    charType = Annotato[int, ctype("char")] UnsignedShort = Annotato[int, struct2.ctype('H')]

  • 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:

    Era:
    button_0 = pulsanti[0] @button_0.clicked.connect

    Ora puoi scrivere:
    @pulsanti[0].clicked.connect

  • Alla libreria standard aggiunto modulo informazioni sulla zona, che include informazioni dal database del fuso orario IANA.

    >>> da zoneinfo importa ZoneInfo
    >>> da datetime import datetime, timedelta
    >>> # Ora legale
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
    >>> stampa(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.nometz()
    "PDT"

    >>> # Ora solare
    >>> dt += timedelta(giorni=7)
    >>> stampa(dt)
    2020-11-07 12:00:00-08:00

    >>> print(dt.nometz())
    PST

  • 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):

    Versione Python 3.4 3.5 3.6 3.7 3.8 3.9
    ————— — — — — — —

    Accesso in lettura a variabili e attributi:
    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_built-in 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_var_istanza 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

    Accesso in scrittura a variabili e attributi:
    write_local 8.7 9.3 5.5 5.3 4.3 4.2
    scrittura_nonlocale 10.5 11.1 5.6 5.5 4.7 4.9
    scrittura_globale 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

    Accesso in lettura alla struttura dei dati:
    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

    Accesso in scrittura alla struttura dati:
    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

    Operazioni sullo stack (o sulla coda):
    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

    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().

Fonte: opennet.ru

Aggiungi un commento