Ju hapimë të paraqesim pjesën e tretë të përkthimit të materialit mbi udhën që ka ndjekur kompania Dropbox, duke implementuar sistemin e verifikimit të llojeve të kodit Python.
â PjesĂ«t e mĂ«parshme: dhe
Arritja e 4 milion linjave të kodit të tipizuar
Një tjetër detyrë e rëndësishme (kjo ishte problemi i dytë më i popullarizuar, që shqetësonte ata që morën pjesë në anketat e brendshme) ishte të rritej sasia e kodit në Dropbox që ishte mbuluar nga kontrolli i llojeve. Ne provuam disa qasje për të zgjidhur këtë detyrë - nga rritja natyrale e bazës së kodit të tipizuar deri te përqendrimi i përpjekjeve të anëtarëve të ekipit mypy në nxjerrjen automatike statike dhe dinamike të llojeve. Në përfundim, krijohej një përshtypje se nuk kishte një strategji të thjeshtë fituese, por arritëm një rritje të shpejtë të sasisë së kodit të annotuar, duke kombinuar shumë qasje.
Si nĂ« rezultatĂ«, nĂ« depozitĂ«n tonĂ« mĂ« tĂ« madhe tĂ« Python-it (me kodin e backend-it), numri i rreshtave tĂ« kodit tĂ« annotuar arriti pothuajse nĂ« 4 milion. Puna pĂ«r tipizimin statik tĂ« kodit u bĂ« pĂ«r rreth tre vjet. Mypy tani mbĂ«shtet lloje tĂ« ndryshme raportesh pĂ«r mbulimin e kodeve me tipe, tĂ« cilat thjeshtojnĂ« vĂ«zhgimin e pĂ«rparimit tĂ« tipizimit. NĂ« veçanti, ne mund tĂ« formulojmĂ« raporte pĂ«r kodin me pasiguri nĂ« tipe, si ato, pĂ«r shembull, me pĂ«rdorimin e qartĂ« tĂ« tipeve Ădo nĂ« annotimet, tĂ« cilat nuk mund tĂ« verifikohen, ose me ato, si importet e bibliotekave tĂ« jashtme, nĂ« tĂ« cilat nuk ka annotime tipesh. Ne, nĂ« kuadĂ«r tĂ« projektit pĂ«r pĂ«rmirĂ«simin e saktĂ«sisĂ« sĂ« verifikimit tĂ« tipave nĂ« Dropbox, kontribuam nĂ« pĂ«rmirĂ«simin e definicioneve tĂ« tipave (tĂ« ashtuquajturat skedarĂ« stub) pĂ«r disa biblioteka tĂ« njohura open-source nĂ« depozitĂ«n qendrore tĂ« Python-it .
Ne implementuam (dhe standardizuam në PEP-të e mëvonshme) mundësi të reja të sistemit të tipeve, të cilat lejojnë përdorimin e tipeve më të sakta për disa modele specifike të Python-it. Një shembull i dukshëm i kësaj është TypeDict, i cili ofron lloje për fjalorë që ngjajnë me JSON, duke pasur një grup të caktuar çelësash string, secili prej të cilëve ka vlerën e vet tipi. Ne do të vazhdojmë të zgjeruam sistemin e tipeve. Me siguri, hapi ynë i ardhshëm do të jetë përmirësimi i mbështetjes për funksionalitetet e Python në punën me numra.

Numri i linjave të kodit të annotuar: server

Numri i linjave të kodit të annotuar: klient

Numri total i linjave të kodit të annotuar
Ja një përmbledhje e karakteristikave kryesore të veprimeve që kemi bërë për të rritur sasinë e kodit të annotuar në Dropbox:
Rreptësia e annotimit. Ne kemi rritur gradualisht kërkesat për rreptësinë e annotimit të kodeve të reja. Filluam me këshilla për linters, që sugjeronin shtimin e annotimeve në skedarët që tashmë kanë disa annotime. Tani ne kërkojmë që të ketë annotime tipesh në skedarët e rinj Python dhe në shumicën e skedarëve ekzistues.
Raportet mbi tipet. Ne dërgojmë raporte çdo javë ekipeve mbi nivelin e tipizimit të kodit të tyre dhe ofrojmë këshilla për atë që duhet të annotohet fillimisht.
Promovimi i mypy. Ne flasim për mypy në ngjarje të ndryshme dhe komunikojmë me ekipet, duke i ndihmuar ata të fillojnë të përdorin anotimet e tipeve.
Anketat. Ne realizojmë anketa periodike të përdoruesve për të identifikuar problemet kryesore. Jemi të gatshëm të shkojmë mjaft larg në zgjidhjen e këtyre problemeve (madje deri në krijimin e një gjuhe të re për të përshpejtuar mypy!).
Performanca. Ne kemi përmirësuar ndjeshëm performancën e mypy përmes përdorimit të demonit dhe mypyc. Kjo është bërë për të zbutur pengesat që ndodhin gjatë procesit të anotimit dhe për të pasur mundësinë të punojmë me volume të mëdha kodi.
Integrimi me redaktorët. Ne krijuam mjete për të mbështetur ekzekutimin e mypy në redaktorët që janë të njohur në Dropbox. Këtu përfshihen PyCharm, Vim dhe VS Code. Kjo e bëri procesin e punës për anotimin e kodit dhe verifikimin e funksionalitetit të tij shumë më të lehtë. Aktivitetet e tilla zakonisht karakterizojnë anotimin e kodit ekzistues.
Analiza statike. Ne kemi krijuar një mjet për të nxjerrë nënshkrimet e funksioneve duke përdorur mjete të analizës statike. Ky mjet mund të punojë vetëm në situata relativisht të thjeshta, por na ka ndihmuar pa shumë përpjekje të rrisim mbulimin e kodit me tipe.
Mbështetje për biblioteka të jashtme. Në shumë nga projektet tona përdoret një set mjetesh SQLAlchemy. Aty përdoren mundësitë dinamike të Python, të cilat tipet PEP 484 nuk mund të modelojnë drejtpërdrejt. Në përputhje me PEP 561, ne krijuam një skedar stub përkatës dhe shkruam një plugin për mypy (), që përmirëson mbështetjen për SQLAlchemy.
Sfidat me të cilat u përballëm
Rruga drejt 4 milion linjave të kodit të tipizuar nuk ishte gjithmonë e lehtë për ne. Në këtë rrugë hasëm shumë gropa dhe bëmë disa gabime. Këtu janë disa nga problemet me të cilat u përballëm. Shpresojmë se tregimi ynë për to do t'u ndihmojë të tjerëve të shmangin probleme të ngjashme.
Skedar tĂ« humbur. Ne filluam punĂ«n me verifikimin e njĂ« sasi tĂ« vogĂ«l skedarĂ«sh. Gjithçka qĂ« nuk pĂ«rfshihej nĂ« kĂ«ta skedarĂ«, nuk u kontrollua. SkedarĂ«t u shtuan nĂ« listĂ«n e verifikimit kur ato morĂ«n shĂ«nime tĂ« para. NĂ«se diçka importohej nga njĂ« modul qĂ« ndodhej jashtĂ« zonĂ«s sĂ« verifikimit, atĂ«herĂ« flitej pĂ«r punĂ«n me vlerat e natyrĂ«s Ădo, tĂ« cilat nuk ishin kontrolluar fare. Kjo shkaktoi njĂ« humbje tĂ« konsiderueshme tĂ« saktĂ«sisĂ« sĂ« tipizimit, veçanĂ«risht nĂ« fazat e hershme tĂ« migrimit. Ky qasje ka funksionuar nĂ« mĂ«nyrĂ« befasuese mirĂ«, megjithatĂ«, situata tipike ishte ajo kur shtimi i skedarĂ«ve nĂ« zonĂ«n e kontrollit zbulonte probleme nĂ« pjesĂ« tĂ« tjera tĂ« bazĂ«s sĂ« kodit. NĂ« rastin mĂ« tĂ« keq, kur dy zona tĂ« izoluara tĂ« kodit bashkoheshin, nĂ« tĂ« cilat, ndaras, tipet ishin tashmĂ« verifikuar, rezultonte se kĂ«to tipe ishin tĂ« papajtueshme me njĂ«ra-tjetrĂ«n. Kjo çonte nĂ« nevojĂ«n pĂ«r tĂ« bĂ«rĂ« shumĂ« ndryshime nĂ« komentet. Tani, duke u kthyer mbrapa, ne kuptojmĂ« se na duhej tĂ« kishim shtuar sa mĂ« parĂ« modulet bazĂ« tĂ« bibliotekĂ«s nĂ« zonĂ«n e kontrollit tĂ« tipave mypy. Kjo do ta bĂ«nte punĂ«n tonĂ« shumĂ« mĂ« tĂ« parashikueshme.
Anotimi i kodit të vjetër. Kur filluam punën, kishim rreth 4 milionë rreshta kod Python të ekzistueshëm. Ishte e qartë se anotimi i këtij kodi ishte një detyrë e vështirë. Ne krijuam një mjet, të quajtur PyAnnotate, i cili mund të mbledhë informacione mbi llojet gjatë ekzekutimit të testeve dhe di të shtojë në kod anotime llojesh duke u bazuar në informacionet e mbledhura. Megjithatë, nuk kemi vërejtur ndonjë adoptim të gjerë të këtij instrumenti. Mbledhja e informacionit të llojeve ishte e ngadalshme, dhe anotimet e gjeneruara automatikisht shpesh kërkonin shumë rregullime manuale. Menduam për të ekzekutuar automatikisht këtë mjet për çdo verifikim të kodit, ose për të mbledhur informacionet e llojeve duke u bazuar në analizën e një volume të vogël të kërkesave të vërteta në internet, por vendosëm të mos e bënim këtë, pasi çdo qasje e tillë ishte shumë e rrezikshme.
Në përfundim, mund të theksojmë se shumica e kodit është annotuar manualisht nga pronarët e tij. Ne, për ta drejtuar këtë proces në rrugën e duhur, përgatisim raporte për modulet dhe funksionet më të rëndësishme që duhet të annotohen. Për shembull, është e rëndësishme të sigurohen anotacione për llojet në modulin e bibliotekës, i cili përdoret në qindra vende. Ndërsa shërbimi i vjetër, i cili zëvendësohet nga njëri i ri, nuk është kaq i rëndësishëm për t'u annotuar. Përveç kësaj, ne jemi duke eksperimentuar me përdorimin e analizës statike për të gjeneruar anotacione llojesh për kodin e vjetër.
Importet ciklike. Më lart kam folur për importet ciklike (për "të endurat e varësive"), ekzistenca e të cilave e ka komplikuar përshpejtimin e mypy. Ne gjithashtu patëm nevojë për të punuar seriozisht për të ofruar mbështetje për të gjitha llojet e idiomave, shkak i krijimit të të cilave janë këto importet ciklike. Së fundmi përfunduam një projekt të madh për rindërtimin e sistemit, që zgjidhi shumicën e problemeve të mypy lidhur me importet ciklike. Këto probleme, në të vërtetë, kanë rrjedhur nga ditët e hershme të projektit, që nga Alore, gjuha mësimore për të cilën ishte fokusuar fillimisht projekti mypy. Sintaksa e Alore lejon të zgjidhen lehtësisht problemet e komandave ciklike të importit. Mypy modern trashëgoi disa kufizime nga implementimi i tij i hershëm, i cili ishte shumë i përshtatshëm për Alore. Python e komplikon punën me importet ciklike kryesisht për shkak të pasigurisë së shprehjeve. Për shembull, gjatë një operacioni të caktimit të vlerave, mund të përcaktohet në të vërtetë një pseudonim tipi. Mypy nuk është gjithmonë në gjendje të zbulojë të tilla gjëra derisa një pjesë e madhe e ciklit të importit të jetë përpunuar. Në Alore nuk kishte të tilla pasiguri. Zgjedhjet e dështuara të marra në fazat e hershme të zhvillimit të sistemit mund të sjellin një surprizë të pakëndshme për programuesin pas shumë vitesh.
Përfundimet: rruga drejt 5 milion rreshtave të kodit dhe horizonteve të reja
Projekti mypy ka kaluar njĂ« rrugĂ« tĂ« gjatĂ« â nga prototipat e hershĂ«m, deri nĂ« sistemin qĂ« kontrollon tipet e kodit tĂ« prodhimit me njĂ« volum prej 4 milion rreshtash. GjatĂ« zhvillimit tĂ« mypy u realizua standardizimi i sugjerimeve pĂ«r tipet nĂ« Python. Sot pĂ«rreth tipizimit tĂ« kodit Python Ă«shtĂ« formuar njĂ« ekosistem i fuqishĂ«m. KĂ«tu kishte vend pĂ«r mbĂ«shtetje bibliotekash, mjetet ndihmĂ«se pĂ«r IDE dhe redaktorĂ«t, si dhe disa sisteme kontrolli tĂ« tipave, secili me avantazhe dhe disavantazhe tĂ« veta.
Megjithatë, ndonëse kontrolli i tipeve tashmë perceptohet në Dropbox si diçka e natyrshme, unë besoj se ne ende jetojmë në agun e tipizimit të kodit Python. Mendoj se teknologjitë e kontrollit të tipeve do të vazhdojnë të zhvillohen dhe përmirësohen.
Nëse nuk e keni përdorur kontrollet e tipeve në projektin tuaj të madh Python, dijeni se tani është një moment shumë i përshtatshëm për të filluar kalimin në tipizimin statik. Kam biseduar me ata që kanë bërë një kalim të tillë. Askush nga ata nuk ka patur pendesë. Kontrolli i tipeve e bën Python një gjuhë që është shumë më e mirë se "Python-i zakonshëm" për zhvillimin e projekteve të mëdha.
Të nderuar lexues! A përdorni kontrollin e tipeve në projektet tuaja Python?
Burimi: habr.com
