Release van de programmeertaal Python 3.11

Na een jaar van ontwikkeling is de belangrijke release van de programmeertaal Python 3.11 gepubliceerd. De nieuwe branch wordt anderhalf jaar ondersteund, waarna er nog eens drieënhalf jaar fixes voor worden gegenereerd om kwetsbaarheden te elimineren.

Tegelijkertijd begon het alfatesten van de Python 3.12-branch (in overeenstemming met het nieuwe ontwikkelingsschema begint het werk aan een nieuwe branch vijf maanden vóór de release van de vorige branch en bereikt het de alpha-testfase tegen de tijd van de volgende release ). De Python 3.12-tak zal zeven maanden in alpha-release zijn, gedurende welke nieuwe functies zullen worden toegevoegd en bugs zullen worden verholpen. Hierna worden de bètaversies gedurende drie maanden getest, waarbij het toevoegen van nieuwe features verboden is en alle aandacht uitgaat naar het oplossen van bugs. Gedurende de laatste twee maanden vóór de vrijgave bevindt de vestiging zich in de fase van de vrijgavekandidaat, waarin de definitieve stabilisatie zal worden uitgevoerd.

Nieuwe toevoegingen aan Python 3.11 zijn onder meer:

  • Er is veel werk verricht om de prestaties te optimaliseren. De nieuwe tak omvat veranderingen met betrekking tot de versnelling en inline-implementatie van functieaanroepen, het gebruik van snelle tolken van standaardbewerkingen (x+x, x*x, xx, a[i], a[i] = z, f(arg) C( arg), o.method(), o.attr = z, *seq), evenals optimalisaties voorbereid door de Cinder- en HotPy-projecten. Afhankelijk van het type belasting is er een toename van de code-uitvoeringssnelheid van 10-60%. Gemiddeld zijn de prestaties op de pyperformance-testsuite met 25% gestegen.

    Het bytecode-cachingmechanisme is opnieuw ontworpen, waardoor de opstarttijd van de tolk met 10-15% is verkort. Objecten met code en bytecode worden nu statisch toegewezen door de tolk, waardoor het mogelijk werd om de fasen van het unmarshallen van bytecode uit de cache en het converteren van objecten met code om in dynamisch geheugen te plaatsen te elimineren.

  • Bij het weergeven van oproeptraceringen in diagnostische berichten is het nu mogelijk om informatie weer te geven over de uitdrukking die de fout veroorzaakte (voorheen werd alleen de regel gemarkeerd zonder aan te geven welk deel van de lijn de fout veroorzaakte). Uitgebreide traceringsinformatie kan ook worden verkregen via de API en worden gebruikt om individuele bytecode-instructies toe te wijzen aan een specifieke positie in de broncode met behulp van de codeobject.co_positions() methode of de C API-functie PyCode_Addr2Location(). De wijziging maakt het veel eenvoudiger om problemen met geneste woordenboekobjecten, meerdere functieaanroepen en complexe rekenkundige expressies op te lossen. Traceback (meest recente oproep als laatste): Bestand "calculation.py", regel 54, in resultaat = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: delen door nul
  • Ondersteuning toegevoegd voor uitzonderingsgroepen, waardoor het programma verschillende uitzonderingen tegelijk kan genereren en verwerken. Om meerdere uitzonderingen te groeperen en samen te voegen, zijn er nieuwe uitzonderingstypen ExceptionGroup en BaseExceptionGroup voorgesteld, en is de expressie “except*” toegevoegd om individuele uitzonderingen uit een groep te markeren.
  • De methode add_note() is toegevoegd aan de klasse BaseException, waardoor u een tekstnotitie aan de uitzondering kunt koppelen, bijvoorbeeld door contextuele informatie toe te voegen die niet beschikbaar is wanneer de uitzondering wordt gegenereerd.
  • Een speciaal Self-type toegevoegd om de huidige privéklasse weer te geven. Self kan worden gebruikt om methoden te annoteren die een instantie van zijn klasse op een eenvoudiger manier retourneren dan met TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
  • Er is een speciaal LiteralString-type toegevoegd dat alleen tekenreeksliterals kan bevatten die compatibel zijn met het LiteralString-type (d.w.z. kale en LiteralString-tekenreeksen, maar geen willekeurige of gecombineerde str-tekenreeksen). Het type LiteralString kan worden gebruikt om het doorgeven van stringargumenten aan functies te beperken, waarbij willekeurige vervanging van delen van strings tot kwetsbaarheden kan leiden, bijvoorbeeld bij het genereren van strings voor SQL-query's of shell-opdrachten. def run_query(sql: LiteralString) -> ... ... def caller( arbitrary_string: str, query_string: LiteralString, table_name: LiteralString, ) -> Geen: run_query("SELECT * FROM studenten") # ok run_query(literal_string) # ok run_query( "SELECT * FROM" + letterlijke_string) # ok run_query(arbitrary_string) # Error run_query( # Error f"SELECT * FROM studenten WHERE naam = {arbitrary_string}" )
  • Het type TypeVarTuple is toegevoegd, waardoor het gebruik van generieke variabelen mogelijk is, in tegenstelling tot TypeVar, dat niet één type omvat, maar een willekeurig aantal typen.
  • De standaardbibliotheek bevat de tomllib-module met functies voor het parseren van het TOML-formaat.
  • Het is mogelijk om individuele elementen van getypte woordenboeken (TypedDict) te markeren met de labels Required en NotRequired om de vereiste en optionele velden te bepalen (standaard zijn alle gedeclareerde velden vereist als de totale parameter niet is ingesteld op False). class Movie(TypedDict): titel: str jaar: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars" } # OK (het jaarveld is optioneel) m3: Film = {“jaar”: 2022} # Fout, het vereiste titelveld is niet ingevuld)
  • De klasse TaskGroup is aan de asyncio-module toegevoegd met de implementatie van een asynchrone contextmanager die wacht tot een groep taken is voltooid. Het toevoegen van taken aan een groep gebeurt met behulp van de create_task() methode. async def main(): async met asyncio.TaskGroup() als tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(another_coro(...)) print("Beide taken zijn nu voltooid .")
  • @dataclass_transform decorateur toegevoegd voor klassen, methoden en functies. Indien gespecificeerd, behandelt het statische typecontrolesysteem het object alsof het de @dataclasses.dataclass decorateur gebruikt. In het onderstaande voorbeeld wordt de klasse CustomerModel bij het controleren van typen op dezelfde manier verwerkt als een klasse met de decorator @dataclasses.dataclass, d.w.z. omdat het een __init__-methode heeft die id- en naamvariabelen accepteert. @dataclass_transform() klasse ModelBase: … klasse CustomerModel(ModelBase): id: int naam: str
  • In reguliere expressies is de mogelijkheid toegevoegd om atomaire groeperingen ((?>...)) en bezittelijke kwantoren (*+, ++, ?+, {m,n}+) te gebruiken.
  • Opdrachtregeloptie "-P" en omgevingsvariabele PYTHONSAFEPATH toegevoegd om automatische bijlage van mogelijk onveilige bestandspaden aan sys.path uit te schakelen.
  • Het hulpprogramma py.exe voor het Windows-platform is aanzienlijk verbeterd en biedt ondersteuning voor de syntaxis "-V:". / " in aanvulling op "- . "
  • Veel macro's in de C API worden omgezet in reguliere of statische inline-functies.
  • De modules uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev en sunau zijn verouderd en worden verwijderd in Python 3.13 vrijgave. PyUnicode_Encode*-functies verwijderd.

Bron: opennet.ru

Voeg een reactie