Na een jaar ontwikkeling is een belangrijke release van de programmeertaal Python 3.11 gepubliceerd. Deze nieuwe tak zal anderhalf jaar worden ondersteund, waarna er nog eens drieënhalf jaar lang correcties voor kwetsbaarheden zullen worden gemaakt.
Tegelijkertijd is de alfatest van de tak Python 3.12 gestart (volgens de nieuwe ontwikkelingsplanning begint het werk aan de nieuwe tak vijf maanden voor de release van de vorige tak en bereikt het alfatestniveau tegen de tijd van de volgende release). De tak Python 3.12 zal zeven maanden in de alfa-releasefase blijven, waarin nieuwe mogelijkheden zullen worden toegevoegd en fouten zullen worden verholpen. Daarna zal er drie maanden beta-testen plaatsvinden, waarin het toevoegen van nieuwe mogelijkheden is verboden en de focus ligt op het oplossen van fouten. De laatste twee maanden vóór de release zal de tak zich in de release kandidaat-fase bevinden, waarin de laatste stabilisatie zal plaatsvinden.
Onder de nieuwigheden die zijn toegevoegd in Python 3.11:
- Er is aanzienlijke inspanning geleverd aan prestatie-optimalisatie. De nieuwe tak bevat wijzigingen met betrekking tot de versnelling en inline-deploy van functieaanroepen, het gebruik van snelle interpreters voor typische operaties (x+x, x*x, x-x, a[i], a[i] = z, f(arg) C(arg), o.method(), o.attr = z, *seq), evenals optimalisaties voorbereid door de projecten Cinder en HotPy. Afhankelijk van het type belasting is er een snelheidstoename van 10-60% gemeld. Gemiddeld is de performance bij het doorlopen van de pyperformance-testset met 25% verbeterd.
Het mechanism voor het cachen van bytecode is herzien, wat de opstarttijd van de interpreter met 10-15% heeft verminderd. Objecten met code en bytecode worden nu statisch geplaatst door de interpreter, waardoor het demarshaling van de uit de cache opgehaalde bytecode en de omzetting van objecten met code voor plaatsing in dynamisch geheugen is geëlimineerd.
- Bij het weergeven van stack traces in diagnostische berichten is informatie toegevoegd over de expressie die de fout heeft veroorzaakt (voorheen werd alleen de regel gemarkeerd zonder details over welk deel van de regel de fout veroorzaakte). Uitgebreide informatie over de stack trace kan ook via de API worden verkregen en gebruikt worden om specifieke bytecode-instructies te koppelen aan een specifieke locatie in de oorspronkelijke code, met behulp van de methode codeobject.co_positions() of de functie C API PyCode_Addr2Location(). Deze wijziging vereenvoudigt het debuggen van problemen met geneste woordenboeken, meerdere functieaanroepen en complexe wiskundige expressies. Traceback (meest recente aanroep laatst): Bestand «calculation.py», regel 54, in result = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: deling door nul
- Ondersteuning voor uitzonderingengroepen is toegevoegd, waardoor het programma in staat is om meerdere verschillende uitzonderingen tegelijkertijd te genereren en te verwerken. Voor het groeperen van meerdere uitzonderingen en hun gezamenlijke oproep zijn nieuwe uitzonderingstypen ExceptionGroup en BaseExceptionGroup geïntroduceerd, en voor het afzonderlijk extraheren van uitzonderingen uit een groep is de expressie «except*» toegevoegd.
- In de BaseException-klasse is de methode add_note() toegevoegd, waarmee tekstnotities aan de uitzondering kunnen worden toegevoegd, bijvoorbeeld om contextuele informatie toe te voegen die tijdens het genereren van de uitzondering niet beschikbaar was.
- Een speciaal type Self is toegevoegd, dat de huidige gesloten klasse vertegenwoordigt. Self kan worden gebruikt om methoden te annoteren die een instantie van hun klasse teruggeven, op een eenvoudigere manier dan met TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
- Een speciaal type LiteralString is toegevoegd, dat alleen stringliteralen kan bevatten die compatibel zijn met het type LiteralString (d.w.z. kale strings en strings van het type LiteralString, maar geen willekeurige of gecombineerde strings van het type str). Het type LiteralString kan worden gebruikt om de overdracht van stringargumenten naar functies te beperken, waarvan willekeurige substitutie van stringdelen kan leiden tot kwetsbaarheden, bijvoorbeeld bij het samenstellen van strings voor SQL-query's of shell-commando's. def run_query(sql: LiteralString) -> … … def caller( arbitrary_string: str, query_string: LiteralString, table_name: LiteralString, ) -> None: run_query(«SELECT * FROM students») # ok run_query(literal_string) # ok run_query(«SELECT * FROM » + literal_string) # ok run_query(arbitrary_string) # Fout run_query( # Fout f»SELECT * FROM students WHERE name = {arbitrary_string}» )
- Het type TypeVarTuple is toegevoegd, waardoor variabele generics kunnen worden gebruikt, in tegenstelling tot TypeVar, dat niet één type, maar een willekeurig aantal types omvat.
- De standaardbibliotheek is uitgebreid met de module tomllib, die functies bevat voor het parseren van het TOML-formaat.
- Het is mogelijk gemaakt om afzonderlijke elementen van getypeerde woordenboeken (TypedDict) te markeren met labels Required en NotRequired om verplichte en niet-verplichte velden te definiëren (standaard zijn alle gedeclareerde velden verplicht in te vullen, tenzij de parameter total op False is ingesteld). class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {«title»: «Black Panther», «year»: 2018} # OK m2: Movie = {«title»: «Star Wars»} # OK (veld year is optioneel) m3: Movie = {«year»: 2022} # Fout, verplicht veld title niet ingevuld)
- De asyncio-module heeft de klasse TaskGroup toegevoegd met een implementatie van een asynchrone contextbeheerder die wacht op de voltooiing van een groep taken. Taken kunnen aan de groep worden toegevoegd via de methode create_task(). async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(…)) task2 = tg.create_task(another_coro(…)) print(«Beide taken zijn nu voltooid.»)
- De decorator voor klassen, methoden en functies @dataclass_transform is toegevoegd, waardoor het systeem voor statische typecontrole het object behandelt alsof de decorator @dataclasses.dataclass is gebruikt. In het onderstaande voorbeeld zal de klasse CustomerModel bij typecontrole worden behandeld zoals een klasse met de decorator @dataclasses.dataclass, d.w.z. als een klasse met een __init__-methode die de variabelen id en name accepteert. @dataclass_transform() class ModelBase: … class CustomerModel(ModelBase): id: int name: str
- In reguliere expressies is de mogelijkheid toegevoegd om atomische groeperingen ((?>…)) en bezitterige (possessive) kwantificatoren (*+, ++, ?+, {m,n}+).
- Er is een optie voor de opdrachtregel «-P» en een omgevingsvariabele PYTHONSAFEPATH toegevoegd om de automatische toevoeging van potentieel onveilige bestandsroutes aan sys.path uit te schakelen.
- De py.exe utility voor het Windows-platform is aanzienlijk verbeterd, waarbij ondersteuning voor de syntaxis «-V:<bedrijf>‚/» is toegevoegd, naast «-<major>.<minor>».
- Veel macro's in de C API zijn omgevormd tot gewone 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 als verouderd verklaard en zullen worden verwijderd in Python 3.13. Functies PyUnicode_Encode* zijn verwijderd.
Bron: opennet.ru
