Lansarea limbajului de programare Python 3.9

După un an de dezvoltare la sfârșitul anului 2019. Pe lângă protocoalele ActivityPub și diaspora, Hubzilla se federează în cadrul rețelei prin propriul său protocol lansare semnificativă a limbajului de programare Python 3.9. Python 3.9 a fost prima lansare după tranziție proiectul de un nou ciclu de pregătire și întreținere a versiunilor. Noile lansări semnificative vor fi acum realizate anual, iar actualizările corective vor fi emise la fiecare două luni. Fiecare ramură semnificativă va fi susținută timp de un an și jumătate, după care vor fi realizate corecturi de securitate timp de încă trei ani și jumătate.

Lucrările la noua ramură încep acum cu cinci luni înainte de lansarea următoarei ramuri, adică simultan cu lansarea Python 3.9 a început testare alpha a ramurii Python 3.10. Ramura Python 3.10 va fi în perioada de lansări alpha timp de șapte luni, timp în care vor fi adăugate noi funcționalități și se vor face corecturi de erori. După aceasta, va urma o perioadă de testare beta de trei luni, în care adăugarea de noi funcționalități va fi interzisă și toate eforturile se vor concentra pe corectarea erorilor. Ultimele două luni înainte de lansare ramura va fi în stadiul de candidate pentru lansare, în care va avea loc stabilizarea finală.

Printre adăugate inovații în Python 3.9:

  • În dicționare, definite folosind clasa încorporată dict, a apărut suport pentru operatorii de fuziune „|” și actualizare „|=”, care completează metodele {**d1, **d2} și dict.update, propuse anterior pentru combinarea dicționarelor.

    >>> 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’}

  • Colecțiile integrate de tipuri includ list, dict și tuple, care pot fi utilizate ca tipuri de bază fără a fi importate din modulul typing. Adică, în loc de typing.List, typing.Dict și typing.Tuple, acum pot fi specificate
    doar list, dict și tuple:

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

  • Furnizate mijloace flexibile pentru a anota funcții și variabile. Pentru atașarea de anotări, modulul typing a adăugat un nou tip Annotated, care extinde tipurile existente cu metadate suplimentare, care pot fi utilizate în analiza statică sau pentru optimizări în timpul executării. Pentru accesul la metadatele din cod, în metoda typing.get_type_hints() a fost adăugat parametrul include_extras.

    charType = Annotated[int, ctype(«char»)]
    UnsignedShort = Annotated[int, struct2.ctype(‘H’)]

  • Îmbunătățit Cerințele gramaticale pentru decoratori – orice expresie care poate fi utilizată în blocuri if și while poate fi acum folosită ca decorator. Această modificare a îmbunătățit semnificativ citibilitatea codului PyQt5 și a simplificat întreținerea acestui modul:

    A fost:
    button_0 = buttons[0]
    @button_0.clicked.connect

    Acum se poate scrie:
    @buttons[0].clicked.connect

  • În biblioteca standard adăugat modul zoneinfo, care include informații din baza de date de fusuri orare IANA.

    >>> from zoneinfo import ZoneInfo
    >>> from datetime import datetime, timedelta
    >>> # Timp de vară
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo(«America/Los_Angeles»))
    >>> print(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    ‘PDT’

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

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

  • A fost adăugat modul graphlib, în care a fost implementată se suportă sortarea topologică a grafurilor.
  • S-au propus metode noi pentru eliminarea prefixelor și sufixelor din șiruri — str.removeprefix(prefix) și str.removesuffix(suffix). Metodele au fost adăugate la obiectele str, bytes, bytearray și collections.UserString.

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

  • A fost utilizat un nou parser PEG (Parsing Expression Grammar), care a înlocuit parserul LL(1). Utilizarea noului parser a permis eliminarea unor „trucuri” folosite pentru a ocoli constrângerile din LL(1) și a redus semnificativ efortul necesar întreținerii parserului. Ca performanță, noul parser este aproximativ la același nivel cu cel anterior, dar îl depășește semnificativ în ceea ce privește flexibilitatea, ceea ce permite o mai mare libertate în proiectarea noilor caracteristici ale limbajului. Codul vechi al parserului este încă păstrat și poate fi readus prin flag-ul „-X oldparser” sau variabila de mediu „PYTHONOLDPARSER=1”, dar va fi eliminat în versiunea 3.10.
  • A fost adăugată posibilitatea de acces a metodelor extinderilor C la starea modulelor în care sunt definite, prin dereferentierea directă a pointerilor în loc de a căuta starea modulului prin funcția PyState_FindModule. Modificarea permite îmbunătățirea performanței modulelor C prin reducerea sau eliminarea completă a costurilor asociate verificării stării modulului. Pentru a asocia modulul cu o clasă, este propusă funcția C PyType_FromModuleAndSpec(), pentru a obține modulul și starea acestuia se folosesc funcțiile C PyType_GetModule() și PyType_GetModuleState(), iar pentru a oferi metodei acces la clasa în care este definită, funcția C PyCMethod și flag-ul METH_METHOD.
  • Colector de gunoi eliminat de la blocarea colecțiilor care includ obiecte reanimat, care rămân accesibile din exterior după lansarea finalizatorului.
  • A fost adăugată metoda os.pidfd_open, permițând utilizarea subsistemului kernel Linux „pidfd” pentru a gestiona situația reutilizării PID (pidfd se leagă de un proces specific și nu se schimbă, în timp ce PID poate fi asociat cu un alt proces după finalizarea procesului curent asociat cu acest PID).
  • Suportul pentru specificația Unicode a fost actualizat la versiunea 13.0.0.
  • Eliminată scurgerile de memorie în timpul reinițializării interpretului Python într-un singur proces.
  • A fost optimizată performanța tipurilor încorporate range, tuple, set, frozenset, list și dict, realizată prin aplicarea protocolului de apel rapid Vectorcall pentru un acces mai rapid la obiectele scrise în C.
  • Modulele _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time și _weakref au fost traduse pentru a se încărca cu inițializare în mai multe etape.
  • Modulele bibliotecii standard audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios și zlib au fost traduse pentru a utiliza un ABI stabil limitat, care rezolvă problema funcționalității construcțiilor modulelor extinse pentru diferite versiuni de Python (la actualizarea versiunii, modulele extinse nu trebuie recompilate, iar modulele compilate pentru 3.9 vor putea funcționa în ramura 3.10).
  • În modulul asyncio, din cauza potențialelor probleme de securitate, suportul pentru parametrul reuse_address a fost întrerupt (utilizarea SO_REUSEADDR pentru UDP în Linux permite diferitelor procese să atașeze socket-uri de ascultare la un port UDP).
  • Au fost adăugate noi optimizări, de exemplu, a fost îmbunătățită performanța handler-elor de semnal în aplicațiile multi-thread, a fost crescută viteza modulului subprocess în mediul FreeBSD și a fost accelerată asignarea variabilelor temporare (asignarea variabilei în expresia „for y in [expr]” acum nu este inferioară ca performanță expresiei „y = expr”). În general, majoritatea testelor arată o scădere a performanței comparativ cu ramura 3.8 (accelerarea se observă doar în testele write_local și write_deque):

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

    Acces la variabile și atribute:
    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

    Acces la scriere pentru variabile și atribute:
    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
    write_global 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

    Acces la citirea structurii de date:
    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

    Acces la scriere pentru structuri de date:
    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

    Operații cu stive (sau cozi):
    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

    Temporizare ciclu:
    loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3

  • Au fost eliminate multe funcții și metode Python 2.7, care anterior fuseseră marcate ca fiind învechite și în ultima versiune au generat un avertisment DeprecationWarning, inclusiv metoda unescape() în html.parser.HTMLParser,
    tostring() și fromstring() în array.array, isAlive() în threading.Thread, getchildren() și getiterator() în ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() și base64.decodestring().

Sursa: opennet.ro

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster