Release van de programmeertaal Python 3.10

Na een jaar van ontwikkeling wordt de belangrijke release van de programmeertaal Python 3.10 gepresenteerd. 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.11-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.11-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.10 zijn onder meer:

  • Implementatie van "match"- en "case"-operatoren voor patroonmatching, die de leesbaarheid van de code verbeteren, het matchen van willekeurige Python-objecten vereenvoudigen en de betrouwbaarheid van de code vergroten door middel van geavanceerde statische typecontrole. De implementatie lijkt veel op de "match"-operator in Scala, Rust en F#, die het resultaat van een gespecificeerde expressie vergelijkt met een lijst met patronen die in blokken zijn opgesomd op basis van de "case"-operator.

    def http_error(status): matchstatus: case 400: return “Slecht verzoek” case 401|403|404: return “Niet toegestaan” case 418: return “Ik ben een theepot” case _: return “Iets anders”

    U kunt objecten, tupels, lijsten en willekeurige reeksen uitpakken om variabelen te binden op basis van bestaande waarden. Het is toegestaan ​​om geneste sjablonen te definiëren, aanvullende “if”-voorwaarden in de sjabloon te gebruiken, maskers (“[x, y, *rest]”), sleutel/waarde-toewijzingen te gebruiken (bijvoorbeeld {“bandbreedte”: b, “latency ”: l} om waarden voor "bandbreedte" en "latentie" uit een woordenboek te extraheren), subsjablonen uit te pakken (":=" operator), benoemde constanten in een sjabloon te gebruiken. In klassen is het mogelijk om het matchgedrag aan te passen met behulp van de “__match__()”-methode.

    uit dataclasses import dataclass @dataclass class Punt: x: int y: int def waar(punt): matchpunt: case Punt(0, 0): print("Origin") case Punt(0, y): print(f" Y={y}") case Point(x, 0): print(f"X={x}") case Point(): print("Ergens anders") 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") ROOD, GROEN, BLAUW = 0, 1, 2 match kleur: case ROOD: print(“Ik zie rood!”) case GROEN: print(“Gras is groen”) case BLAUW: print(“Ik voel de blues :(“)

  • Het is nu mogelijk om haakjes in de with-instructie te gebruiken om de definitie van een verzameling contextmanagers over meerdere regels te verdelen. Het is ook toegestaan ​​om een ​​komma achter te laten na de laatste contextmanager in de groep: met ( CtxManager1() als voorbeeld1, CtxManager2() als voorbeeld2, CtxManager3() als voorbeeld3, ): ...
  • Verbeterde rapportage van de codelocatie van fouten met betrekking tot niet-gesloten accolades en aanhalingstekens in letterlijke tekenreeksen. Als er bijvoorbeeld een niet-gesloten accolade is, markeert de aanwijzer nu in plaats van een syntaxisfout in de volgende constructie, de openingsaccolade en geeft aan dat er geen sluitend blok is. Bestand "example.py", regel 1 verwacht = {9:1, 18:2, 19:2, 27:3, 28:3, 29:3, 36:4, 37:4, ^SyntaxError: '{' is nooit gesloten geweest

    Aanvullende gespecialiseerde syntaxisfoutmeldingen toegevoegd: ontbrekend vac-symbool vóór een blok en in woordenboeken, een tuple niet scheiden met haakjes, ontbreken van een komma in lijsten, specificeren van een "try"-blok zonder "except" en "finally", met behulp van "= " in plaats van "= =" in vergelijkingen, waarbij *-expressies in f-strings worden gespecificeerd. Bovendien zorgt het ervoor dat de gehele problematische uitdrukking wordt benadrukt, niet alleen het begin, en wordt er meer expliciete informatie gegeven over de context van fouten die verband houden met onjuiste inspringing. >>> def foo(): ... if lel: ... x = 2 Bestand " ", regel 3 x = 2 ^ IndentationError: verwacht een ingesprongen blok na de 'if'-instructie in regel 2

    Bij fouten veroorzaakt door typefouten in de namen van attributen en variabelennamen in een functie, wordt een aanbeveling met de juiste naam uitgevoerd. >>>collections.namedtoplo Traceback (meest recente oproep laatste): Bestand « ", regel 1, in AttributeError: module 'collecties' heeft geen attribuut 'namedtoplo'. Bedoelde je: genaamdtuple?

  • Voor foutopsporingstools en profilers worden traceergebeurtenissen geleverd met de exacte regelnummers van de uitgevoerde code.
  • De instelling sys.flags.warn_default_encoding is toegevoegd om een ​​waarschuwing weer te geven over mogelijke fouten die verband houden met TextIOWrapper en open() bij het verwerken van UTF-8-gecodeerde bestanden zonder expliciet de optie 'encoding=»utf-8″' op te geven (ASCII-codering wordt standaard gebruikt). De nieuwe release biedt ook de mogelijkheid om een ​​'encoding="locale"'-waarde op te geven om de codering in te stellen op basis van de huidige landinstelling.
  • Er is een nieuwe operator toegevoegd aan de typmodule, die hulpmiddelen biedt voor het specificeren van typeannotaties, waardoor het gebruik van de syntaxis “X | Y" om een ​​van de typen te selecteren (X-type of Y-type). def vierkant(getal: int | float) -> int | float: return number ** 2 is equivalent aan de eerder ondersteunde constructie: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
  • De Concatenate-operator en de ParamSpec-variabele zijn toegevoegd aan de typmodule, waarmee u aanvullende informatie kunt doorgeven voor statische typecontrole wanneer u Callable gebruikt. De typemodule voegt ook speciale waarden TypeGuard toe om typebeschermingsfuncties te annoteren en TypeAlias ​​om expliciet een typealias te definiëren. StrCache: TypeAlias ​​= 'Cache[str]' # een typealias
  • De functie zip() implementeert een optionele “strikte” vlag, die, indien gespecificeerd, controleert of de argumenten die worden herhaald dezelfde lengte hebben. >>> lijst(zip(('a', 'b', 'c'), (1, 2, 3), strikt=Waar)) [('a', 1), ('b', 2) , ('c', 3)] >>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True)) Traceback (meest recente oproep laatste ): … ValueError: zip() argument 2 is langer dan argument 1
  • Er worden nieuwe ingebouwde functies aiter() en anext() voorgesteld met de implementatie van asynchrone analogen met de functies iter() en next().
  • Het werk van de str(), bytes() en bytearray() constructors bij het werken met kleine objecten is met 30-40% versneld.
  • Het aantal importbewerkingen in de runpy-module verminderd. Het commando "python3 -m module_name" werkt nu gemiddeld 1.4 keer sneller dankzij de vermindering van geïmporteerde modules van 69 naar 51.
  • De LOAD_ATTR-instructie maakt gebruik van een cachingmechanisme voor individuele opcodes, waardoor het mogelijk werd om het werk met reguliere attributen tot 36% te versnellen, en met slots tot 44%.
  • Bij het bouwen van Python met de optie “--enable-optimizations” is nu de modus “-fno-semantic-interposition” ingeschakeld, waardoor de tolk tot 30% kan worden versneld in vergelijking met bouwen met de optie “--enable-shared " keuze.
  • De hashlib- en ssl-modules hebben ondersteuning toegevoegd voor OpenSSL 3.0.0 en zijn gestopt met het ondersteunen van OpenSSL-versies ouder dan 1.1.1.
  • De oude parser is verwijderd, die in de vorige branch werd vervangen door de PEG-parser (Parsing Expression Grammar). De formatteermodule is verwijderd. De lusparameter is verwijderd uit de asyncio API. Methoden die eerder verouderd waren, zijn verwijderd. De Py_UNICODE_str*-functies die Py_UNICODE*-tekenreeksen manipuleren zijn verwijderd.
  • De distutils-module is verouderd en staat gepland voor verwijdering in Python 3.12. In plaats van distutils wordt aanbevolen om de modules setuptools, packing, platform, shutil, subprocess en sysconfig te gebruiken. De wstr-structuur in PyUnicodeObject is verouderd en staat gepland voor verwijdering.

Bron: opennet.ru

Voeg een reactie