Na een jaar ontwikkeling is een significante release van de programmeertaal Python 3.10 gepresenteerd. Deze nieuwe tak zal anderhalf jaar worden ondersteund, waarna er nog drieënhalf jaar lang beveiligingscorrecties voor zullen worden gemaakt.
Tegelijkertijd is de alfaversie van Python 3.11 begonnen (volgens het nieuwe ontwikkelingsschema begint het werk aan een nieuwe tak vijf maanden vóór de release van de vorige tak en bereikt het alfasysteem tegen de tijd van de volgende release). De tak Python 3.11 zal zeven maanden in alfase zijn, waarbij nieuwe functies worden toegevoegd en fouten worden gecorrigeerd. Daarna zal er drie maanden lang bèta-testen plaatsvinden, waarin nieuwe functies niet mogen worden toegevoegd en de focus volledig op bugfixes ligt. De laatste twee maanden voor de release zal de tak zich in de release-kandidaatfase bevinden, waarin de finale stabilisatie zal worden uitgevoerd.
Onder de nieuwigheden in Python 3.10 zijn:
- De 'match' en 'case' operators zijn geïmplementeerd voor patroonmatching, die de leesbaarheid van de code verbeteren, het matchen van willekeurige Python-objecten vereenvoudigen en de betrouwbaarheid van de code verhogen door de mogelijkheid van uitgebreide statische typecontrole. De implementatie lijkt sterk op de 'match' operator die in de talen Scala, Rust en F# wordt geboden, die het resultaat van de uitvoering van een opgegeven expressie vergelijkt met een lijst van patronen die in blokken op basis van de 'case' operator zijn opgesomd.
def http_error(status): match status: case 400: return 'Bad request' case 401|403|404: return 'Not allowed' case 418: return 'I’m a teapot' case _: return 'Something else'
Het is mogelijk om objecten, tuples, lijsten en willekeurige reeksen uit te pakken om variabelen te binden op basis van beschikbare waarden. Het definiëren van geneste sjablonen, het gebruik van extra voorwaarden "if" in het sjabloon, het toepassen van maskers ("[x, y, *rest]"), het mappen van sleutel/waarde paren (bijvoorbeeld, {"bandwidth": b, "latency": l} voor het extraheren van de waarden "bandwidth" en "latency" uit een woordenboek), het extraheren van sub-sjablonen (de operator ":="), en het gebruik van benoemde constanten in het sjabloon zijn toegestaan. In klassen is het mogelijk om het gedrag bij het overeenkomen aan te passen met de methode "__match__()".
from dataclasses import dataclass @dataclass class Point: x: int y: int def whereis(point): match point: case Point(0, 0): print("Oorsprong") case Point(0, y): print(f"Y={y}") case Point(x, 0): print(f"X={x}") case Point(): print("Elders") case _: print("Geen punt") match point: case Point(x, y) if x == y: print(f"Y=X op {x}") case Point(x, y): print(f"Niet op de diagonaal") RED, GREEN, BLUE = 0, 1, 2 match color: case RED: print("Ik zie rood!") case GREEN: print("Gras is groen") case BLUE: print("Ik voel de blues :(")
- Het is mogelijk om ronde haakjes te gebruiken in de with-operator om definitie van een collectie van contextmanagers over meerdere regels te spreiden. Ook is het toegestaan om een komma achter de laatste contextmanager in de groep achter te laten: with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): …
- De foutmeldingen over de locatie in de code met betrekking tot niet-gesloten haakjes en aanhalingstekens in stringliteralen zijn verbeterd. Bijvoorbeeld, wanneer er een haakje niet is gesloten, wordt in plaats van een syntaxisfout in de volgende constructie, nu het openingshaakje gemarkeerd en wordt aangegeven dat er een sluitend blok ontbreekt. File "example.py", line 1 expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, ^ SyntaxError: '{' was never closed
Er zijn extra gespecialiseerde foutmeldingen voor syntaxis toegevoegd: het ontbreken van het teken ':' voor een blok en in woordenboeken, het niet omhullen van een tuple met haakjes, het ontbreken van een komma in lijsten, het opgeven van een 'try'-blok zonder 'except' en 'finally', het gebruik van '=' in plaats van '==' in vergelijkingen, en het opgeven van *-uitdrukkingen in f-strings. Bovendien wordt nu de gehele problematische expressie gemarkeerd, niet alleen het begin, en is er een duidelijkere informatievoorziening over de context van fouten gerelateerd aan onjuiste inspringing. >>> def foo(): … if lel: … x = 2 Bestand '', regel 3 x = 2 ^ IndentationError: verwachte een ingesprongen blok na 'if'-verklaring op regel 2
Bij fouten veroorzaakt door typefouten in de naamgeving van attributen en variabelen binnen een functie wordt een aanbeveling met de juiste naam weergegeven. >>> collections.namedtoplo Traceback (laatste oproep laatst): Bestand '', regel 1, in AttributeError: module 'collections' heeft geen attribuut 'namedtoplo'. Bedoelde je: namedtuple?
- Voor foutopsporingshulpmiddelen en profilers zijn de exacte regels van de uitgevoerde code in traceerbaarheidsevents opgegeven.
- De instelling sys.flags.warn_default_encoding is toegevoegd om waarschuwingen weer te geven over mogelijke fouten gerelateerd aan de verwerking in TextIOWrapper en open() bij bestanden in UTF-8 codering zonder expliciet de optie ‘encoding="utf-8"‘ op te geven (standaard wordt ASCII gebruikt). Ook is in deze nieuwe versie de mogelijkheid toegevoegd om ‘encoding="locale"‘ in te stellen om de codering op basis van de huidige locale in te stellen.
- In de module typing, die hulpmiddelen biedt voor het specificeren van type-aanduidingen, is een nieuwe operator toegevoegd waarmee de syntaxis 'X | Y' kan worden gebruikt om een van de types te kiezen (type X of type Y). def square(number: int | float) -> int | float: return number ** 2 is gelijk aan de eerder ondersteunde constructie: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
- In de module typing is de operator Concatenate en de variabele ParamSpec toegevoegd, die extra informatie kunnen doorgeven voor statische typecontrole bij het gebruik van Callable. In de module typing zijn ook speciale waarden TypeGuard toegevoegd voor het annoteren van typebeveiligingsfuncties en TypeAlias voor het expliciet definiëren van type-aliases. StrCache: TypeAlias = 'Cache[str]' # een type-alias
- De functie zip() heeft een optionele vlag 'strict' die, wanneer opgegeven, controleert op gelijke lengte van de te itereren argumenten. >>> list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True)) [('a', 1), ('b', 2), ('c', 3)] >>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True)) Traceback (most recent call last): … ValueError: zip() argument 2 is langer dan argument 1
- Nieuwe ingebouwde functies aiter() en anext() zijn voorgesteld, die asynchrone vergelijkingen zijn van de functies iter() en next().
- De prestaties van de constructors str(), bytes() en bytearray() zijn met 30-40% versneld bij het werken met kleine objecten.
- Het aantal importbewerkingen in de module runpy is verminderd. De opdracht 'python3 -m module_naam' wordt nu gemiddeld 1,4 keer sneller uitgevoerd door het aantal geïmporteerde modules te verlagen van 69 naar 51.
- In de LOAD_ATTR-instructie is een cachemechanisme voor afzonderlijke opcodes geïmplementeerd, waardoor de prestaties met gewone attributen tot 36% zijn verbeterd en met slots tot 44%.
- Bij het bouwen van Python met de optie '--enable-optimizations' wordt nu de modus '-fno-semantic-interposition' ingeschakeld, waarmee de prestaties van de interpreter tot 30% kunnen worden verbeterd in vergelijking met de build met de optie '--enable-shared'.
- In de modules hashlib en ssl is ondersteuning voor OpenSSL 3.0.0 toegevoegd en is de ondersteuning voor OpenSSL-versies ouder dan 1.1.1 stopgezet.
- De oude parser is verwijderd, die in de vorige tak werd vervangen door een PEG-parser (Parsing Expression Grammar). De formatter-module is verwijderd. De parameter loop is uit de API asyncio verwijderd. Methodes die eerder als verouderd waren verklaard, zijn verwijderd. Functies Py_UNICODE_str*, die werken met Py_UNICODE*-strings, zijn verwijderd.
- De module distutils is als verouderd verklaard en staat gepland voor verwijdering in Python 3.12. In plaats van distutils wordt aangeraden om de modules setuptools, packaging, platform, shutil, subprocess en sysconfig te gebruiken. De structuur wstr in PyUnicodeObject is ook verouderd verklaard en staat gepland voor verwijdering.
Bron: opennet.ru
