Uscita del linguaggio di programmazione Python 3.9

Dopo un anno di sviluppo presentato uscita significativa del linguaggio di programmazione Python 3.9. Python 3.9 è stata la prima uscita dopo il passaggio del progetto a un nuovo ciclo di preparazione e supporto delle versioni. Ora nuove uscite significative saranno rilasciate una volta all'anno, mentre gli aggiornamenti correttivi verranno rilasciati ogni due mesi. Ogni ramo significativo sarà supportato per un anno e mezzo, dopodiché verranno forniti aggiornamenti per altri tre anni e mezzo per la correzione di vulnerabilità.

Il lavoro su un nuovo ramo inizia ora cinque mesi prima del rilascio del ramo successivo, cioè contemporaneamente all'uscita di Python 3.9 è iniziato alpha testing della branch Python 3.10. La branch Python 3.10 sarà in fase di alpha release per sette mesi, durante i quali verranno aggiunte nuove funzionalità e corretti bug. Successivamente, per tre mesi sarà effettuato il test delle versioni beta, durante il quale l'aggiunta di nuove funzionalità sarà vietata e ci si concentrerà esclusivamente sulla correzione dei bug. Gli ultimi due mesi prima del rilascio, la branch sarà in fase di release candidate, durante i quali verrà effettuata la stabilizzazione finale.

Tra aggiunti novità in Python 3.9:

  • Nei dizionari definiti tramite la classe integrata dict, è stata introdotta è supportato l'operatore di fusione «|» e quello di aggiornamento «|=», che completano i metodi {**d1, **d2} e dict.update, precedentemente suggeriti per unire i dizionari.

    >>> 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 | x
    {‘key2’: ‘value2 from x’, ‘key3’: ‘value3 from y’, ‘key1’: ‘value1 from x’}

  • Nella raccolta integrata di tipi sono inclusi list, dict e tuple, che possono essere utilizzati come tipi di base senza importare dal modulo typing. In altre parole, invece di typing.List, typing.Dict e typing.Tuple ora è possibile specificare
    semplicemente list, dict e tuple:

    def greet_all(names: list[str]) -> None:
    for name in names:
    print('Hello', name)

  • Forniti strumenti flessibili per annotare funzioni e variabili. È stato aggiunto un nuovo tipo Annotated nel modulo typing per allegare annotazioni, ampliando i tipi esistenti con metadati aggiuntivi, utilizzabili per l'analisi statica o per ottimizzazioni durante l'esecuzione. È stato aggiunto un parametro include_extras al metodo typing.get_type_hints() per accedere ai metadati dal codice.

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

  • Mitigati i requisiti grammaticali per i decorator: qualsiasi espressione adatta per essere utilizzata nei blocchi if e while può ora essere usata come decorator. Questa modifica ha notevolmente migliorato la leggibilità del codice PyQt5 e semplificato la manutenzione di questo modulo:

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

    Ora è possibile scrivere:
    @buttons[0].clicked.connect

  • Nella libreria standard è stato aggiunto modulo zoneinfo, che include informazioni dalla base dei fusi orari IANA.

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

    >>> dt.tzname()
    ‘PDT’

    >>> # Ora standard
    >>> dt += timedelta(days=7)
    >>> print(dt)
    2020-11-07 12:00:00-08:00

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

  • È stato aggiunto il modulo graphlib, che è stata realizzata supporta l'ordinamento topologico dei grafi.
  • Sono stati proposti nuovi metodi per rimuovere prefissi e suffissi dalle stringhe — str.removeprefix(prefix) e str.removesuffix(suffix). I metodi sono stati aggiunti agli oggetti str, bytes, bytearray e collections.UserString.

    >>> s = "FooBar"
    >>> s.removeprefix("Foo")
    ‘Bar’

  • È stato utilizzato un nuovo parser PEG (Parsing Expression Grammar), che ha sostituito il parser LL(1). L'applicazione del nuovo parser ha permesso di eliminare alcuni "hack" usati per bypassare le limitazioni in LL(1), riducendo notevolmente il lavoro richiesto per la manutenzione del parser. In termini di prestazioni, il nuovo parser si colloca a un livello simile a quello precedente, ma lo supera significativamente in flessibilità, consentendo maggiore libertà nella progettazione di nuove funzionalità del linguaggio. Il codice del vecchio parser è ancora disponibile e può essere riattivato utilizzando l'opzione "-X oldparser" o la variabile d'ambiente "PYTHONOLDPARSER=1", ma sarà rimosso nella versione 3.10.
  • Fornito la possibilità di accesso ai metodi delle estensioni C allo stato dei moduli in cui sono definiti, utilizzando l'indirizzamento diretto dei puntatori invece di cercare lo stato del modulo tramite la funzione PyState_FindModule. Questa modifica consente di migliorare le prestazioni dei moduli C diminuendo o eliminando completamente le spese generali per il controllo dello stato del modulo. Per associare un modulo a una classe, è stata proposta la funzione C PyType_FromModuleAndSpec(); per ottenere il modulo e il suo stato, le funzioni C PyType_GetModule() e PyType_GetModuleState(); e per fornire al metodo accesso alla classe in cui è definito, la funzione C PyCMethod e il flag METH_METHOD.
  • Raccoglitore di spazzatura esente da blocchi di raccolta che includono oggetti riattivati, che rimangono accessibili dall'esterno dopo l'esecuzione del finalizzatore.
  • Aggiunto il metodo os.pidfd_open, che consente di utilizzare il sottosistema del kernel Linux "pidfd" per gestire la situazione del riutilizzo del PID (pidfd è associato a un processo specifico e non cambia, mentre il PID può essere legato a un altro processo dopo che il processo attuale associato a questo PID è terminato).
  • Il supporto per la specifica Unicode è stato aggiornato alla versione 13.0.0.
  • Eliminato memoria durante la re-inizializzazione dell'interprete Python in un singolo processo.
  • È stata ottimizzata la performance dei tipi incorporati range, tuple, set, frozenset, list e dict, implementata attraverso l'uso del protocollo di chiamata rapida Vectorcall per accessi più veloci agli oggetti scritti in C.
  • I moduli _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time e _weakref sono stati spostati alla modalità di caricamento con inizializzazione in più fasi..
  • I moduli della libreria standard audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios e zlib sono stati tradotti per utilizzare un ABI stabile e limitato, che risolve il problema della compatibilità delle build dei moduli estensioni per diverse versioni di Python (non è necessario ricompilare i moduli estensione durante l'aggiornamento della versione, e i moduli compilati per 3.9 potranno funzionare nella branch 3.10).
  • Nel modulo asyncio, a causa di potenziali problemi di sicurezza, è stata rimossa la supporto per il parametro reuse_address (l'uso di SO_REUSEADDR per UDP in Linux consente a più processi di collegare socket di ascolto a una porta UDP).
  • Sono state aggiunte nuove ottimizzazioni, come un aumento delle prestazioni dei gestori di segnali in applicazioni multithread, un'accelerazione del modulo subprocess in ambiente FreeBSD e un'accelerazione nell'assegnazione delle variabili temporanee (l'assegnazione di una variabile nell'espressione «for y in [expr]» ora ha prestazioni comparabili all'espressione «y = expr»). In generale, la maggior parte dei test mostra una diminuzione delle prestazioni rispetto al ramo 3.8 (l'accelerazione 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 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_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

    Accesso in scrittura a variabili e attributi:
    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
    scrivi_global 19.7 21.2 18.0 18.0 15.8 17.2
    scrivi_classvar 92.9 96.0 104.6 102.1 39.2 43.2
    scrivi_instancevar 44.6 45.8 40.0 38.9 35.5 40.7
    scrivi_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7

    Accesso alla struttura dati:
    leggi_lista 24.2 24.5 20.8 20.8 19.0 21.1
    leggi_deque 24.7 25.5 20.2 20.6 19.8 21.6
    leggi_dict 24.3 25.7 22.3 23.0 21.0 22.5
    leggi_strdict 22.6 24.3 19.5 21.2 18.9 21.6

    Accesso in scrittura alla struttura dati:
    scrivi_lista 27.1 28.5 22.5 21.6 20.0 21.6
    scrivi_deque 28.7 30.1 22.7 21.8 23.5 23.2
    scrivi_dict 31.4 33.3 29.3 29.2 24.7 27.8
    scrivi_strdict 28.4 29.9 27.5 25.2 23.1 29.8

    Operazioni su stack (o coda):
    lista_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

    Tempi di ciclo:
    costo_ciclo 0.5 0.6 0.4 0.3 0.3 0.3

  • Rimossi molte funzionalità e metodi di Python 2.7, precedentemente segnati come deprecati e che nel rilascio precedente portavano a un avviso DeprecationWarning, 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

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster