Efter ett Ärs utveckling lanseras en betydande version av programmeringssprÄket Python 3.10. Den nya versionen kommer att stödjas i ett och ett halvt Är, varefter ytterligare tre och ett halvt Är kommer att Àgnas Ät att skapa korrigeringar för sÀkerhetsproblem.
Samtidigt inleddes alfa-testning av versionen Python 3.11 (i enlighet med det nya utvecklingsschemat inleds arbetet med den nya versionen fem mÄnader före lanseringen av den föregÄende versionen och nÄr alfa-testningsstadiet vid nÀsta lansering). Versionen Python 3.11 kommer att vara i alfa-version i sju mÄnader, under vilken tid nya funktioner kommer att lÀggas till och buggar kommer att ÄtgÀrdas. Efter detta kommer det under tre mÄnader att pÄgÄ betatestning, under vilken tid nya funktioner inte kommer att tillÄtas och allt fokus kommer att lÀggas pÄ att fixa buggar. De tvÄ sista mÄnaderna före lanseringen kommer versionen att befinna sig i releasekandidatstadiet, dÀr den slutliga stabiliseringen kommer att utföras.
Bland nyheterna som lagts till i Python 3.10:
- Operatörerna "match" och "case" har implementerats för mönstermatchning, vilket förbÀttrar lÀsbarheten av koden, förenklar matchning av godtyckliga Python-objekt och ökar kodens pÄlitlighet tack vare möjligheten till förbÀttrad statisk typkontroll. Implementeringen pÄminner mycket om operatören "match" som erbjuds i sprÄken Scala, Rust och F#, vilket jÀmför resultatet av ett angivet uttryck med en lista av mönster som anges i block baserade pÄ operatören "case".
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"
Möjlighet att packa upp objekt, tupler, listor och godtyckliga sekvenser för att binda variabler baserat pÄ befintliga vÀrden. Definition av inbÀddade mallar, anvÀndning av ytterligare villkor "if" i mallen, tillÀmpning av maskar ("[x, y, *rest]"), kartlÀggning av nyckel/vÀrde-par (till exempel {"bandwidth": b, "latency": l} för att extrahera vÀrden för "bandwidth" och "latency" frÄn en ordbok), extrahering av under-mallar (operatorn ":=", anvÀndning av namngivna konstanter i mallen. I klasser Àr det möjligt att justera beteendet vid matchning genom metoden "__match__()".
from dataclasses import dataclass @dataclass class Point: x: int y: int def whereis(point): match point: case Point(0, 0): print("Ursprung") case Point(0, y): print(f"Y={y}") case Point(x, 0): print(f"X={x}") case Point(): print("NÄgon annanstans") case _: print("Inte en punkt") match point: case Point(x, y) if x == y: print(f"Y=X vid {x}") case Point(x, y): print(f"Inte pÄ diagonalen") RED, GREEN, BLUE = 0, 1, 2 match color: case RED: print("Jag ser rött!") case GREEN: print("GrÀset Àr grönt") case BLUE: print("Jag kÀnner mig nedstÀmd :(")
- Möjlighet att anvĂ€nda parenteser i "with"-operatören för att sprida definitionen av en samling av kontextmanager över flera rader. Det Ă€r ocksĂ„ tillĂ„tet att lĂ€mna ett kommatecken efter den sista kontextmanagern i gruppen: with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): âŠ
- FörbÀttrad information om placeringen av kodfel relaterade till icke-stÀngda klammerparenteser och citat i strÀngliteraler. Till exempel, vid en icke-stÀngd klammerparentes informeras inte om synsÀttsfel i den efterföljande konstruktionen, utan pekaren markerar nu den öppna klammerparentesen och informerar om det saknas en stÀngande block. 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
Ytterligare specialiserade felmeddelanden för syntax har lagts till: saknad symbol «:» före block och i ordböcker, brist pĂ„ parenteser runt tupel, saknad kommatecken i listor, angivande av blocket «try» utan «except» och «finally», anvĂ€ndning av «=» istĂ€llet för «==» i jĂ€mförelser, angivande av *-uttryck i f-strĂ€ngar. Dessutom har hela det problematiska uttrycket markerats, inte bara dess början, och mer tydlig information om kontexten för fel relaterade till felaktig indragning har sĂ€kerstĂ€llts. >>> def foo(): ⊠if lel: ⊠x = 2 File «», line 3 x = 2 ^ IndentationError: förvĂ€ntade ett indraget block efter âifâ-uttalandet pĂ„ rad 2
Vid fel orsakade av stavfel i attributnamn och variabelnamn i funktionen ges en rekommendation med det korrekta namnet. >>> collections.namedtoplo Traceback (most recent call last): File «», line 1, in AttributeError: modulen âcollectionsâ har inget attribut ânamedtoploâ. Menade du: namedtuple?
- För felsökningsverktyg och profilerare har specifika radnummer för exekverad kod lagts till i spÄrningshÀndelser.
- InstĂ€llningen sys.flags.warn_default_encoding har lagts till för att visa en varning om potentiella fel relaterade till hantering i TextIOWrapper och open()-filer i UTF-8-kodning utan att tydligt ange alternativet âencoding=»utf-8âłâ (standardkodningen Ă€r ASCII). I den nya versionen finns ocksĂ„ möjlighet att ange vĂ€rdet âencoding=»locale»â för att stĂ€lla in kodningen baserat pĂ„ den aktuella lokalen.
- I modulen typing, som tillhandahÄller verktyg för typannoteringar, har en ny operator lagts till som gör det möjligt att anvÀnda syntaxen «X | Y» för att vÀlja ett av typerna (typ X eller typ Y). def square(number: int | float) -> int | float: return number ** 2 motsvarar den tidigare stödda konstruktionen: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
- I modulen typing har operatorn Concatenate och variabeln ParamSpec lagts till, vilket gör att ytterligare information kan överföras för statisk typkontroll vid anvĂ€ndning av Callable. Modulen typing har ocksĂ„ fĂ„tt specialvĂ€rden TypeGuard för att annotera typ skyddsfunktioner och TypeAlias för att entydigt definiera en typalias. StrCache: TypeAlias = âCache[str]â # en typalias
- I funktionen zip() har en valfri flagga "strict" implementerats, dĂ€r det kontrolleras att de itererade argumenten har samma lĂ€ngd. >>> 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 Ă€r lĂ€ngre Ă€n argument 1
- Nya inbyggda funktioner aiter() och anext() har föreslagits som asynkrona motsvarigheter till funktionerna iter() och next().
- Prestandan hos str(), bytes() och bytearray() har ökat med 30-40% vid arbete med smÄ objekt.
- Antalet importoperationer i modulen runpy har minskat. Kommandot "python3 -m modulnamn" körs nu i genomsnitt 1,4 gÄnger snabbare tack vare en minskning av importerade moduler frÄn 69 till 51.
- I instruktionen LOAD_ATTR har en mekanism för caching av enskilda opcode implementerats, vilket har gjort det möjligt att öka prestandan vid arbete med vanliga attribut med upp till 36% och med slots med upp till 44%.
- Vid byggnation av Python med alternativet "--enable-optimizations" aktiveras nu lÀget "-fno-semantic-interposition", vilket gör det möjligt att öka tolkens prestanda med upp till 30% jÀmfört med byggnation med alternativet "--enable-shared".
- I modulerna hashlib och ssl har stöd för OpenSSL 3.0.0 lagts till och stöd för versioner av OpenSSL Àldre Àn 1.1.1 har tagits bort.
- Den gamla parsern har tagits bort, som ersattes av PEG-parsaren (Parsing Expression Grammar) i en tidigare version. Modulen formatter har tagits bort. Parametern loop har tagits bort frÄn API:t asyncio. Metoder som tidigare deklarerats som förÄldrade har tagits bort. Funktionerna Py_UNICODE_str*, som manipulerar strÀngar Py_UNICODE*, har tagits bort.
- Modulen distutils har förklarats som förÄldrad och Àr planerad för borttagning i Python 3.12. IstÀllet för distutils rekommenderas att anvÀnda modulerna setuptools, packaging, platform, shutil, subprocess och sysconfig. Strukturen wstr har ocksÄ förts över till PyUnicodeObject och markerats som förÄldrad och planerad för borttagning.
KĂ€lla: opennet.ru
