Uscita del linguaggio di programmazione Python 3.9

Dopo un anno di sviluppo presentato rilascio significativo del linguaggio di programmazione Python 3.9. Python 3.9 è stato il primo rilascio dopo transizione il progetto su un nuovo ciclo di preparazione e supporto delle versioni. I nuovi rilasci significativi saranno ora formati una volta all'anno, mentre gli aggiornamenti correttivi saranno rilasciati ogni due mesi. Ogni ramo significativo sarà supportato per un anno e mezzo, dopo di che verranno formati correttivi per vulnerabilità per altri tre anni e mezzo.

Il lavoro sul nuovo ramo inizia ora cinque mesi prima del rilascio del ramo successivo, ossia contemporaneamente al rilascio di Python 3.9 è iniziato il test alpha del ramo Python 3.10. Il ramo Python 3.10 sarà in fase di rilascio alpha per sette mesi, durante i quali saranno aggiunte nuove funzionalità e corretti errori. Dopo questo, ci saranno tre mesi di test delle versioni beta, durante i quali sarà vietato aggiungere nuove funzionalità e ogni attenzione sarà rivolta alla correzione degli errori. Gli ultimi due mesi prima del rilascio il ramo sarà in fase di candidato al rilascio, in cui verrà effettuata la stabilizzazione finale.

Tra aggiunti novità in Python 3.9:

  • Nei dizionari definiti con la classe incorporata dict, è comparso è supportato l'operatore di fusione «|» e l'operatore di aggiornamento «|=», che completano i metodi {**d1, **d2} e dict.update, precedentemente proposti per unire i dizionari.

    >>> x = {"key1": "value1 da x", "key2": "value2 da x"}
    >>> y = {"key2": "value2 da y", "key3": "value3 da y"}

    >>> x | y
    {'key1': 'value1 da x', 'key2': 'value2 da y', 'key3': 'value3 da y'}

    >>> y | x
    {'key2': 'value2 da x', 'key3': 'value3 da y', 'key1': 'value1 da x'}

  • Nella collezione dei tipi incorporata sono inclusi list, dict e tuple, che possono essere utilizzati come tipi di base senza importare dal modulo typing. Cioè, invece di typing.List, typing.Dict e typing.Tuple ora è possibile indicare
    semplicemente list, dict e tuple:

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

  • Sono forniti strumenti flessibili per annotare funzioni e variabili. Per allegare annotazioni, nel modulo typing è stato aggiunto un nuovo tipo Annotated, che estende 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’)]

  • Ampliati i requisiti grammaticali per i decoratori: qualsiasi espressione appropriata per l'uso nei blocchi if e while può ora essere utilizzata come decoratore. 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 puoi scrivere:
    @buttons[0].clicked.connect

  • Nella libreria standard è stata aggiunta modulo zoneinfo, che include informazioni dal database 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 implementata supporta l'ordinamento topologico dei grafi.
  • Disponibili 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 attivato nuovo parser PEG (Parsing Expression Grammar), che ha sostituito il parser LL(1). L'uso del nuovo parser ha consentito di eliminare alcuni "hack" utilizzati per aggirare le limitazioni in LL(1), riducendo notevolmente il carico di lavoro per la manutenzione del parser. In termini di prestazioni, il nuovo parser è approssimativamente allo stesso livello del precedente, ma lo supera significativamente in termini di flessibilità, consentendo maggior libertà nella progettazione di nuove funzionalità del linguaggio. Il codice del vecchio parser è ancora conservato e può essere ripristinato utilizzando il flag "-X oldparser" o la variabile di ambiente "PYTHONOLDPARSER=1", ma verrà rimosso nella versione 3.10.
  • È stata fornita accesso migliorato ai metodi delle estensioni C allo stato dei moduli in cui sono definiti, utilizzando la dereferenziazione diretta dei puntatori invece di cercare lo stato del modulo tramite la funzione PyState_FindModule. Questa modifica migliora le prestazioni dei moduli in C riducendo o eliminando completamente i costi aggiuntivi per il controllo dello stato del modulo. Per associare un modulo a una classe, è stata introdotta la funzione C PyType_FromModuleAndSpec(), mentre per ottenere il modulo e il suo stato si utilizzano le funzioni C PyType_GetModule() e PyType_GetModuleState(), e per consentire a un metodo di accedere alla classe in cui è definito, si utilizza la funzione C PyCMethod e il flag METH_METHOD.
  • Il garbage collector è stato rimosso dalla blocco delle collezioni che includono oggetti riattivati, che rimangono accessibili dall'esterno dopo l'avvio del finalizzatore.
  • È stato aggiunto il metodo os.pidfd_open, che consente di utilizzare la sottosistema del kernel Linux "pidfd" per gestire la situazione di riutilizzo del PID (pidfd è associato a un processo specifico e non cambia, mentre il PID può essere assegnato a un altro processo dopo il completamento del processo attuale associato a quel PID).
  • Il supporto per la specifica Unicode è stato aggiornato alla versione 13.0.0.
  • Risolto perdita di memoria durante la reinizializzazione dell'interprete Python in un singolo processo.
  • È stata ottimizzata la performance dei tipi incorporati range, tuple, set, frozenset, list e dict, realizzata attraverso l'applicazione del protocollo di chiamata rapida Vectorcall per un accesso più veloce agli oggetti scritti in C.
  • I moduli _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time e _weakref sono stati tradotti per il caricamento con inizializzazione a più fasi.
  • I moduli della libreria standard audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios e zlib sono stati adattati per utilizzare un ABI stabile e limitato, che risolve il problema di compatibilità delle build dei moduli di estensione per diverse versioni di Python (aggiornando la versione non è necessario ricompilare i moduli di estensione, e i moduli compilati per la versione 3.9 potranno funzionare nella branch 3.10).
  • Nel modulo asyncio, a causa di potenziali problemi di sicurezza, è stata interrotta la supporto per il parametro reuse_address (l'uso di SO_REUSEADDR per UDP in Linux consente a diversi processi di associare socket in ascolto a una porta UDP).
  • Sono state aggiunte nuove ottimizzazioni, ad esempio la performance dei gestori di segnali nelle applicazioni multithreading è stata migliorata, la velocità del modulo subprocess è aumentata nell'ambiente FreeBSD e l'assegnazione delle variabili temporanee è stata accelerata (l'assegnazione di una variabile nell'espressione "for y in [expr]" ora non è inferiore in prestazioni all'espressione "y = expr"). In generale, la maggior parte dei test dimostrano ha mostrato una riduzione delle prestazioni rispetto alla branch 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 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_builtin 21.1 21.6 18.5 19.0 7.5 7.7
    leggi_classvar_da_classe 25.6 26.5 20.7 19.5 18.4 18.6
    leggi_classvar_daistanza 22.8 23.5 18.8 17.1 16.4 20.1
    leggi_varistanza 32.4 33.1 28.0 26.3 25.4 27.7
    leggi_slot_varistanza 27.8 31.3 20.8 20.8 20.2 24.5
    leggi_namedtuple 73.8 57.5 45.0 46.8 18.4 23.2
    leggi_metodo_bound 37.6 37.9 29.6 26.9 27.7 45.9

    Accesso alla scrittura di variabili e attributi:
    scrivi_locale 8.7 9.3 5.5 5.3 4.3 4.2
    scrivi_nonlocale 10.5 11.1 5.6 5.5 4.7 4.9
    scrivi_globale 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_varistanza 44.6 45.8 40.0 38.9 35.5 40.7
    scrivi_slot_varistanza 35.6 36.1 27.3 26.6 25.7 27.7

    Accesso alla lettura della 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 alla scrittura della 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 di stack (o coda):
    lista_inserisci_ritira 93.4 112.7 75.4 74.2 50.8 53.9
    deque_inserisci_ritira 43.5 57.0 49.4 49.2 42.5 45.5
    deque_inserisci_ritira_sinistra 43.7 57.3 49.7 49.7 42.8 45.5

    Tempi di ciclo:
    sovraccarico_ciclo 0.5 0.6 0.4 0.3 0.3 0.3

  • Rimossi molte funzioni e metodi di Python 2.7, precedentemente contrassegnati come obsoleti e che nel rilascio precedente generavano un avviso DeprecationWarning, inclusi 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