Efter et års udvikling er der nu en betydelig udgivelse af programmeringssproget Python 3.10. Den nye version vil blive understøttet i halvandet år, hvorefter der i yderligere tre og et halvt år vil blive lavet rettelser til sikkerhedsproblemer.
Samtidig er alpha-testningen af Python 3.11 begyndt (i overensstemmelse med den nye udviklingsplan starter arbejdet med den nye version fem måneder før udgivelsen af den forrige version og når alpha-teststadiet i takt med den kommende udgivelse). Python 3.11 vil være i alpha-udgiftsstadiet i syv måneder, i løbet af hvilken tid der vil blive tilføjet nye funktioner og rettet fejl. Efter dette vil beta-testningen finde sted i tre måneder, hvor tilføjelse af nye funktioner vil være forbudt, og al fokus vil være på at rette fejl. I de sidste to måneder før udgivelsen vil versionen være i release-kandidatstadiet, hvor den endelige stabilisering vil finde sted.
Blandt de nye funktioner tilføjet i Python 3.10:
- Operatorerne «match» og «case» til mønstergenkendelse er blevet implementeret, hvilket forbedrer læsbarheden af koden, forenkler sammenligningen af vilkårlige Python-objekter og øger kodepålideligheden takket være muligheden for udvidet statisk typekontrol. Implementeringen ligner meget «match»-operatoren, der tilbydes i sprog som Scala, Rust og F#, som sammenligner resultatet af udførelsen af det angivne udtryk med en liste over mønstre, der er anført i blokke baseret på «case»-operatoren.
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»
Det er nu muligt at pakke objekter, tupler, lister og vilkårlige sekvenser ud for at binde variabler baseret på eksisterende værdier. Det er tilladt at definere indlejrede skabeloner, bruge yderligere 'if' betingelser i skabelonen, anvende masker (‘[x, y, *rest]’), lave key/value mapping (f.eks. {«bandwidth»: b, «latency»: l} for at udtrække værdierne «bandwidth» og «latency» fra et ordbog), udtrække underskabeloner (operator ‘:=’), samt bruge navngivne konstanter i skabelonen. I klasser kan adfærd ved matchning tilpasses ved hjælp af metoden ‘__match__()’.
from dataclasses import dataclass @dataclass class Point: x: int y: int def whereis(point): match point: case Point(0, 0): print(«Origin») case Point(0, y): print(f»Y={y}») case Point(x, 0): print(f»X={x}») case Point(): print(«Somewhere else») case _: print(«Not a point») match point: case Point(x, y) if x == y: print(f»Y=X at {x}») case Point(x, y): print(f»Not on the diagonal») RED, GREEN, BLUE = 0, 1, 2 match color: case RED: print(«I see red!») case GREEN: print(«Grass is green») case BLUE: print(«I’m feeling the blues :(«)
- Muligheden for at bruge parenteser i 'with' operatoren til at sprede definitionen af en samling af kontekstmanagere over flere linjer er nu tilgængelig. Det er også tilladt at efterlade et komma efter den sidste kontekstmanager i gruppen: with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): …
- Forbedret information om placeringen af fejl i koden relateret til uafsluttede krøllede parenteser og anførselstegn i strengliteraler. For eksempel, når en krøllet parentes ikke er lukket, fremhæver indikatoren nu den åbne krøllede parentes i stedet for at give en syntaksfejl for den efterfølgende konstruktion, og angiver, at der mangler en lukningsblok. File «example.py», line 1 expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, ^ SyntaxError: ‘{‘ var aldrig lukket
Der er tilføjet yderligere specialiserede syntaksfejlmeddelelser: mangel på ':' før blokke og i ordbøger, udeblevne tuple-paranteser, mangel på kommaer i lister, angivelse af blok 'try' uden 'except' og 'finally', brug af '=' i stedet for '==' i sammenligninger, angivelse af *-udtryk i f-strenge. Desuden er hele det problematiske udtryk fremhævet, ikke kun starten, og der gives mere eksplicit information om konteksten for fejl relateret til forkert indrykning. >>> def foo(): … if lel: … x = 2 Fil «», linje 3 x = 2 ^ IndentationError: forventede et indrykket blok efter 'if' udsagnet i linje 2
I fejl forårsaget af tastefejl i navne på attributter og variabler i funktioner er der tilføjet anbefalinger med det korrekte navn. >>> collections.namedtoplo Traceback (seneste kald sidst): Fil «», linje 1, i AttributeError: modulet ‘collections’ har ikke attributten ‘namedtoplo’. Mente du: namedtuple?
- Til fejlsøgningsværktøjer og profileringsværktøjer er der sikret angivelse af præcise linjenumre for den udførte kode i sporingsbegivenheder.
- Indstillingen sys.flags.warn_default_encoding er tilføjet for at udskrive advarsler om potentielle fejl relateret til behandling i TextIOWrapper og open() af filer i UTF-8-kodning uden tydelig angivelse af indstillingen ‘encoding="utf-8"‘ (standardkodningen er ASCII). I den nye version er det også muligt at angive værdien ‘encoding="locale"‘ for at indstille kodningen baseret på den aktuelle lokalitet.
- I typing-modulet, der tilbyder værktøjer til at angive typeannoteringer, er der tilføjet en ny operator, der muliggør brug af syntaksen «X | Y» til at vælge mellem en af typerne (type X eller type Y). def square(number: int | float) -> int | float: return number ** 2 svarer til den tidligere understøttede konstruktion: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
- I typing-modulet er operatoren Concatenate og variablen ParamSpec tilføjet, som muliggør overgivelse af yderligere oplysninger til statisk typekontrol ved brug af Callable. Typing-modulet har også fået specielle værdier TypeGuard til annotering af typebeskyttelsesfunktioner og TypeAlias til tydelig definition af en typealias. StrCache: TypeAlias = ‘Cache[str]’ # en typealias
- Funktionen zip() har en valgfri 'strict'-flag, som, når den angives, kontrollerer, om de itererede argumenter har samme længde. >>> 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 (seneste kald sidste): … ValueError: zip() argument 2 er længere end argument 1
- Nye indbyggede funktioner aiter() og anext() er blevet introduceret som asynkrone svar på funktionerne iter() og next().
- Ydelsen af konstruktørerne str(), bytes() og bytearray() er blevet forbedret med 30-40% ved håndtering af små objekter.
- Antallet af importoperationer i modulet runpy er reduceret. Kommandoen 'python3 -m modul_navn' kører nu i gennemsnit 1,4 gange hurtigere på grund af reduktionen i importerede moduler fra 69 til 51.
- Instruktionen LOAD_ATTR har implementeret en cachingmekanisme for enkelte opkoder, hvilket har øget hastigheden for normale attributter med op til 36% og for slots med op til 44%.
- Ved opbygning af Python med indstillingen '--enable-optimizations' aktiveres nu '-fno-semantic-interposition' mode, der kan øge hastigheden af fortolkeren med op til 30% i forhold til bygningen med indstillingen '--enable-shared'.
- I modulerne hashlib og ssl tilføjes der support for OpenSSL 3.0.0, og supporten for versioner af OpenSSL ældre end 1.1.1 ophører.
- Den gamle parser er blevet fjernet og erstattet af PEG parser (Parsing Expression Grammar) fra den tidligere version. Modulet formatter er blevet fjernet. Parameteren loop er blevet fjernet fra API asyncio. Metoder, der tidligere blev erklæret forældede, er blevet fjernet. Funktioner Py_UNICODE_str*, der manipulerer med strenge Py_UNICODE*, er blevet fjernet.
- Modulet distutils er blevet erklæret forældet og planlægges til fjernelse i Python 3.12. I stedet for distutils anbefales det at bruge modulerne setuptools, packaging, platform, shutil, subprocess og sysconfig. Strukturen wstr i PyUnicodeObject er blevet klassificeret som forældet og planlagt til fjernelse.
Kilde: opennet.ru
