PĂ€rast aastast arendust on vĂ€lja antud oluline Python 3.10 programmeerimiskeele vĂ€ljaanne. Uut versiooni toetatakse ĂŒheksa kuu jooksul ning sellele jĂ€rgneb veel kolm ja pool aastat haavatavuste parandamiseks.
Samal ajal alustati Python 3.11 versiooni alfa-testimist (vastavalt uuele arendusgraafikule algab töö uue versiooni kallal viie kuu jooksul enne eelmise versiooni vÀljaandmist ja saavutab alfa-testimise etapi toimumise ajaks). Python 3.11 versioon jÀÀb alfa-vÀljaande staadiumisse seitsmeks kuuks, mille jooksul lisatakse uusi funktsioone ja kÔrvaldatakse vigu. PÀrast seda toimub kolme kuu jooksul beetatestimine, mille ajal uute funktsioonide lisamine on keelatud ning kÔik tÀhelepanu suunatakse vigade kÔrvaldamisele. Viimased kaks kuud enne vÀljaandmist on versioon kandidaadi staadiumis, kus toimub lÔplik stabiliseerimine.
Python 3.10-sse lisatud uuenduste seas:
- Rakendatud on «match» ja «case» operaatorid mustrite sobitamiseks, mis parendavad koodi loetavust, lihtsustavad vabatahtlike Python-objektide sobitamist ning suurendavad koodi usaldusvÀÀrkust tĂ€nu laieneva staatilise tĂŒĂŒpide kontrolli vĂ”imalusele. Rakendus sarnaneb paljuski Scala, Rust ja F# keeltes pakutud «match» operaatoriga, mis vĂ”rdleb antud vĂ€ljendi tulemuse nimekirja mustritega, mis on loetletud «case» operaatori pĂ”hjal olevates plokkides.
def http_error(status): match status: case 400: return «Vale pÀring» case 401|403|404: return «Ei ole lubatud» case 418: return «Ma olen teekannu» case _: return «Midagi muud»
Muudatavate objektide, tuplide, loendite ja suvaliste jÀrjestuste lahtipakkimine muutujate sidumiseks olemasolevate vÀÀrtuste pÔhjal on vÔimalik. Toetatakse pesastatud mallide mÀÀratlemist, lisatingimuste "if" kasutamist mallis, maskide rakendamist ("[x, y, *rest]"), vÔtme/vÀÀrtuse sidumiste kaardistamist (nt {"bandwidth": b, "latency": l}, et vÀlja vÔtta vÀÀrtused "bandwidth" ja "latency" sÔnastikust), alamallide eraldamist (operaator ":="), nimeliste konstantide kasutamist mallis. Klassides on vÔimalik sÀtete kohandamine vastavuse leidmise kÀitumise osas meetodi "__match__()" abil.
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 :(")
- Kontekstihaldurite kogumi mÀÀratlemiseks mitmele reale lahtiste sulgude kasutamise vĂ”imalus. Samuti on lubatud jĂ€tta koma viimasest konteksti haldurist rĂŒhmas: with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): âŠ
- Parandatud on teavitamist vigu koodi asukoha osas, mis on seotud sulgete ja jutumĂ€rkide sulgemata jĂ€tmisega stringi literaalides. NĂ€iteks, kui sulg on suletud, siis selle asemel, et teavitada sĂŒntaksi veast jĂ€rgnevates konstruktsioonides, tuvastab nĂ€idik nĂŒĂŒd avatud sulge ja teavitab sulgevate plokkide puudumisest. Fail «example.py», rida 1 expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, ^ SyntaxError: â{â jĂ€i kunagi sulgemata
Lisa on lisatud tĂ€iendavad spetsialiseeritud sĂŒntaksi veateated: puuduv sĂŒmbol â:â ploki ja sĂ”nastike ees, tuple'ite ĂŒmberpaigutamise mittevĂ”tmine, loendites komade puudumine, ploki âtryâ nĂ€itamine ilma âexceptâ ja âfinallyâ ning â=â kasutamine vĂ”rreldes â==â, samuti *-avaldiste nĂ€itamine f-string'ides. Lisaks on tagatud kogu probleemse avaldise esitlemine, mitte ainult selle algus, ja selgem teavitamine vale sisseseadmisega seotud vigade kontekstist. >>> def foo(): ⊠if lel: ⊠x = 2 Fail ââ, rida 3 x = 2 ^ IndentationError: oodata, et plokk oleks sisseseatud pĂ€rast âifâ lauset real 2.
Atributi nimede ja muutuja nimede Ă”igekirjakonfliktidelt pĂ”hjustatud vigades on vĂ€lja antud soovitus Ă”ige nimega. >>> collections.namedtoplo Traceback (most recent call last): Fail ââ, rida 1, moodulis AttributeError: moodul âcollectionsâ ei sisalda atribuuti ânamedtoploâ. Kas tunned Ă€ra: namedtuple?
- Debugimise tööriistade ja profiilide korral on tagatud, et jĂ€lgimisĂŒritustes on mĂ€rgitud tĂ€psed realood, kus kood on tĂ€idetud.
- Lisatud sys.flags.warn_default_encoding seade, mis annab hoiatuse vÔimalike vigade kohta, mis on seotud TextIOWrapper-is ja open() funktsioonidega UTF-8 kodeeritud failide töötlemisel ilma 'encoding=»utf-8»' valikuta (vaikimisi kasutatakse ASCII kodeeringut). Uues vÀljaandes on samuti vÔimalik mÀÀrata 'encoding=»locale»' vÀÀrtus, et seadistada kodeering vastavalt praegusele lokaalsele seadistusele.
- Typing moodulisse, mis pakub vahendeid tĂŒĂŒbi annotatsioonide mÀÀramiseks, on lisatud uus operaator, mis vĂ”imaldab kasutada sĂŒntaksit «X | Y», et valida ĂŒks tĂŒĂŒpidest (tĂŒĂŒp X vĂ”i tĂŒĂŒp Y). def square(number: int | float) -> int | float: return number ** 2 on ekvivalentne varasema toega konstruktsiooniga: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
- Typing moodulisse on lisatud Concatenate operaator ja ParamSpec muutuja, mis vĂ”imaldavad edastada tĂ€iendavat teavet staatiliseks tĂŒĂŒbi kontrollimiseks Callable kasutamisel. Typing moodulisse on samuti lisatud erivÀÀrtused TypeGuard tĂŒĂŒbi kaitse funktsioonide annotatsiooniks ja TypeAlias, et selgelt mÀÀratleda tĂŒĂŒbi hĂŒĂŒdnimi. StrCache: TypeAlias = âCache[str]â # tĂŒĂŒbi hĂŒĂŒdnimi
- zip() funktsioonis on rakendatud valikuline "strict" lipp, mille mÀÀramisel kontrollitakse, kas iteratiivsete argumentide pikkused on vĂ”rdsed. >>> 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 on pikem kui argument 1
- Pakutud on uued sisseehitatud funktsioonid aiter() ja anext() koos asĂŒnkroonselt funktsioonidele iter() ja next() vastavate analoogidega.
- str(), bytes() ja bytearray() konstruktorite tÔhusust on kiirus 30-40% vÔrreldes vÀikeste objektidega.
- Moodulis runpy on vĂ€henenud impordi operatsioonide arv. KĂ€sk "python3 -m nimi_moodul" kĂ€ivitub nĂŒĂŒd keskmiselt 1,4 korda kiiremini tĂ€nu imporditud moodulite arvu vĂ€hendamisele 69-lt 51-le.
- LOAD_ATTR kÀsus on aktiveeritud eraldi opkoodide vahemÀlu mehhanism, mis on vÔimaldanud tavapÀraste atribuutide töötlemise kiirus tÔsta 36%, ja slotide puhul kuni 44%.
- Python'i kompileerimisel valiku "--enable-optimizations" korral aktiivne reĆŸiim "-fno-semantic-interposition", mis vĂ”imaldab vĂ”rreldes "--enable-shared" valiku kasutamisega tĂ”sta tĂ”lgendi kiirus kuni 30%.
- hashlib ja modul ssl lisatud tugi OpenSSL 3.0.0 ja lÔpetatud versioonide OpenSSL tugi, mis on vanemad kui 1.1.1.
- Eemaldatud vana parser, mille asendas eelnevas haru parser PEG (Parsing Expression Grammar). Eemaldatud moodul formatter. API asyncio's on eemaldatud parameeter loop. Eemaldatud on meetodid, mis olid varem mÀrgitud kui aegunud. Eemaldatud on Py_UNICODE_str* funktsioonid, mis manipuleerivad Py_UNICODE* stringidega.
- Moodul distutils on kuulutatud aegunuks ja on plaanis eemaldada Python 3.12-s. Distutils'i asemel soovitatakse kasutada mooduleid setuptools, packaging, platform, shutil, subprocess ja sysconfig. Aegunuks on tunnustatud ka wstr struktuur PyUnicodeObject'is, mis on samuti plaanis eemaldada.
Allikas: opennet.ru
