Llançament del llenguatge de programació Python 3.11

Després d'un any de desenvolupament, s'ha publicat l'important llançament del llenguatge de programació Python 3.11. La nova branca tindrà suport durant un any i mig, després del qual durant tres anys i mig més es generaran correccions per eliminar vulnerabilitats.

Al mateix temps, van començar les proves alfa de la branca de Python 3.12 (d'acord amb el nou calendari de desenvolupament, el treball en una nova branca comença cinc mesos abans del llançament de la branca anterior i arriba a l'etapa de proves alfa en el moment de la propera versió). ). La branca de Python 3.12 estarà en versió alfa durant set mesos, durant els quals s'afegiran noves funcions i es solucionaran els errors. Després d'això, les versions beta es provaran durant tres mesos, durant els quals es prohibirà afegir noves funcions i es prestarà tota l'atenció a la correcció d'errors. Durant els dos últims mesos abans de l'alliberament, la branca estarà en l'etapa de candidat a l'alliberament, en la qual es realitzarà l'estabilització final.

Les noves incorporacions a Python 3.11 inclouen:

  • S'ha fet un treball important per optimitzar el rendiment. La nova branca inclou canvis relacionats amb l'acceleració i el desplegament en línia de trucades de funcions, l'ús d'intèrprets ràpids d'operacions estàndard (x+x, x*x, xx, a[i], a[i] = z, f(arg) C(arg), o.method(), o.attr = z, *seq), així com optimitzacions preparades pels projectes Cinder i HotPy. Depenent del tipus de càrrega, hi ha un augment de la velocitat d'execució del codi del 10 al 60%. De mitjana, el rendiment a la suite de proves pyperformance va augmentar un 25%.

    S'ha redissenyat el mecanisme d'emmagatzematge en memòria cau de codi de bytes, que ha reduït el temps d'inici de l'intèrpret en un 10-15%. Els objectes amb codi i bytecode són ara assignats estàticament per part de l'intèrpret, la qual cosa va permetre eliminar les etapes d'unmarshalling bytecode extrets de la memòria cau i convertir objectes amb codi per col·locar-los a la memòria dinàmica.

  • Quan es mostren traces de trucades als missatges de diagnòstic, ara és possible mostrar informació sobre l'expressió que va provocar l'error (anteriorment, només es destacava la línia sense detallar quina part de la línia va provocar l'error). També es pot obtenir informació de traça ampliada a través de l'API i utilitzar-la per assignar instruccions de bytecode individuals a una posició específica del codi font mitjançant el mètode codeobject.co_positions() o la funció de l'API C PyCode_Addr2Location(). El canvi fa que sigui molt més fàcil depurar problemes amb objectes de diccionari imbricats, múltiples trucades de funcions i expressions aritmètiques complexes. Traceback (última trucada més recent): fitxer "calculation.py", línia 54, al resultat = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: divisió per zero
  • S'ha afegit suport per a grups d'excepcions, donant al programa la possibilitat de generar i processar diverses excepcions diferents alhora. Per agrupar múltiples excepcions i plantejar-les juntes, s'han proposat nous tipus d'excepció ExceptionGroup i BaseExceptionGroup i s'ha afegit l'expressió "excepte*" per destacar excepcions individuals d'un grup.
  • El mètode add_note() s'ha afegit a la classe BaseException, que us permet adjuntar una nota de text a l'excepció, per exemple, afegint informació contextual que no està disponible quan es llança l'excepció.
  • S'ha afegit un tipus d'auto especial per representar la classe privada actual. Self es pot utilitzar per anotar mètodes que retornen una instància de la seva classe d'una manera més senzilla que amb TypeVar. classe MyLock: def __enter__(self) -> Self: self.lock() return self
  • S'ha afegit un tipus especial LiteralString que només pot incloure literals de cadena compatibles amb el tipus LiteralString (és a dir, cadenes nues i LiteralString, però no cadenes de cadena arbitràries o combinades). El tipus LiteralString es pot utilitzar per limitar el pas d'arguments de cadenes a funcions, substitució arbitrària de parts de cadenes en les quals pot provocar vulnerabilitats, per exemple, quan es generen cadenes per a consultes SQL o ordres de shell. def run_query(sql: LiteralString) -> ... ... def caller( arbitrary_string: str, query_string: LiteralString, nom_taula: LiteralString, ) -> Cap: run_query("SELECT * FROM students") # ok run_query(literal_string) # ok run_query( "SELECT * FROM" + literal_string) # ok run_query (cadena_arbitrària) # Error run_query( # Error f"SELECT * FROM estudiants WHERE nom = {cadena_arbitrària}" )
  • S'ha afegit el tipus TypeVarTuple, que permet l'ús de variables genèriques, a diferència de TypeVar, que no cobreixen un tipus, sinó un nombre arbitrari de tipus.
  • La biblioteca estàndard inclou el mòdul tomllib amb funcions per analitzar el format TOML.
  • És possible marcar elements individuals dels diccionaris escrits (TypedDict) amb les etiquetes Obligatòria i No requerida per determinar els camps obligatoris i opcionals (per defecte, tots els camps declarats són obligatoris si el paràmetre total no està definit com a Fals). class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars" } # D'acord (el camp de l'any és opcional) m3: Pel·lícula = {“any”: 2022} # Error, el camp de títol obligatori no s'ha omplert)
  • La classe TaskGroup s'ha afegit al mòdul asyncio amb la implementació d'un gestor de context asíncron que espera que es completi un grup de tasques. L'addició de tasques a un grup es fa mitjançant el mètode create_task(). async def main(): async amb asyncio.TaskGroup() com a tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(another_coro(...)) print("Les dues tasques s'han completat ara .")
  • S'ha afegit el decorador @dataclass_transform per a classes, mètodes i funcions, quan s'especifica, el sistema de comprovació de tipus estàtic tracta l'objecte com si utilitzes el decorador @dataclasses.dataclass. A l'exemple següent, la classe CustomerModel, en comprovar els tipus, es processarà de manera similar a una classe amb el decorador @dataclasses.dataclass, és a dir. com tenir un mètode __init__ que accepta variables id i nom. @dataclass_transform() classe ModelBase: ... classe CustomerModel(ModelBase): id: int nom: str
  • En les expressions regulars, s'ha afegit la capacitat d'utilitzar l'agrupació atòmica ((?>...)) i els quantificadors possessius (*+, ++, ?+, {m,n}+).
  • S'ha afegit l'opció de línia d'ordres "-P" i la variable d'entorn PYTHONSAFEPATH per desactivar la connexió automàtica de camins de fitxers potencialment insegurs a sys.path.
  • La utilitat py.exe per a la plataforma Windows s'ha millorat significativament, afegint suport per a la sintaxi "-V:". / " a més de "- . "
  • Moltes macros de l'API C es converteixen en funcions en línia regulars o estàtiques.
  • Els mòduls uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev i sunau han quedat obsolets i s'eliminaran a Python versió 3.13. S'han eliminat les funcions PyUnicode_Encode*.

Font: opennet.ru

Afegeix comentari