It-triq għall-iċċekkjar tat-tip 4 miljun linja ta 'kodiċi Python. Parti 3

Nippreżentaw għall-attenzjoni tiegħek it-tielet parti tat-traduzzjoni ta 'materjal dwar it-triq li ħa Dropbox meta implimentat sistema ta' verifika tat-tip għall-kodiċi Python.

It-triq għall-iċċekkjar tat-tip 4 miljun linja ta 'kodiċi Python. Parti 3

→ Partijiet preċedenti: l-ewwel и tieni

Nilħqu 4 miljun linja ta 'kodiċi ittajpjat

Sfida ewlenija oħra (u t-tieni l-aktar tħassib komuni fost dawk mistħarrġa internament) kienet iż-żieda fl-ammont ta 'kodiċi kopert minn kontrolli tat-tip fi Dropbox. Ippruvajna diversi approċċi biex insolvu din il-problema, minn tkabbir naturali tad-daqs tal-codebase ittajpjat sa niffukaw l-isforzi tat-tim mypy fuq inferenza tat-tip awtomatizzata statika u dinamika. Fl-aħħar, deher li ma kien hemm l-ebda strateġija rebbieħa sempliċi, iżda stajna niksbu tkabbir rapidu fil-volum ta 'kodiċi annotat billi ngħaqqdu ħafna approċċi.

Bħala riżultat, l-akbar repożitorju Python tagħna (b'kodiċi backend) għandu kważi 4 miljun linja ta 'kodiċi annotat. Ix-xogħol fuq it-tajpjar tal-kodiċi statiku tlesta f'madwar tliet snin. Mypy issa jappoġġja diversi tipi ta 'rapporti ta' kopertura tal-kodiċi li jagħmluha aktar faċli biex timmonitorja l-progress tat-tajping. B'mod partikolari, nistgħu niġġeneraw rapporti dwar kodiċi b'ambigwitajiet fit-tipi, bħal, pereżempju, użu espliċitu ta' tip Any f'annotazzjonijiet li ma jistgħux jiġu vverifikati, jew b'affarijiet bħall-importazzjoni ta' libreriji ta' partijiet terzi li m'għandhomx annotazzjonijiet tat-tip. Bħala parti minn proġett biex tittejjeb l-eżattezza tal-iċċekkjar tat-tip f'Dropbox, aħna kkontribwejna biex intejbu d-definizzjonijiet tat-tip (l-hekk imsejħa fajls stub) għal xi libreriji ta' sors miftuħ popolari f'repożitorju ċentralizzat ta' Python ittajpjat.

Implimentajna (u standardizzajna f'PEPs sussegwenti) karatteristiċi ġodda tas-sistema tat-tip li jippermettu tipi aktar preċiżi għal xi mudelli speċifiċi ta 'Python. Eżempju notevoli ta 'dan huwa TypeDict, li jipprovdi tipi għal dizzjunarji bħal JSON li għandhom sett fiss ta 'ċwievet ta' string, kull wieħed b'valur tat-tip tiegħu stess. Aħna se nkomplu nespandu s-sistema tat-tip. Il-pass li jmiss tagħna x'aktarx se jkun li ntejbu l-appoġġ għall-kapaċitajiet numeriċi ta 'Python.

It-triq għall-iċċekkjar tat-tip 4 miljun linja ta 'kodiċi Python. Parti 3
Numru ta' linji ta' kodiċi annotati: server

It-triq għall-iċċekkjar tat-tip 4 miljun linja ta 'kodiċi Python. Parti 3
Numru ta' linji ta' kodiċi annotati: klijent

It-triq għall-iċċekkjar tat-tip 4 miljun linja ta 'kodiċi Python. Parti 3
Numru totali ta' linji ta' kodiċi annotati

Hawn ħarsa ġenerali lejn il-karatteristiċi ewlenin tal-affarijiet li għamilna biex inżidu l-ammont ta’ kodiċi annotati fi Dropbox:

Rigorozza annotazzjoni. Żidna gradwalment ir-rekwiżiti għar-rigorożità tal-annotazzjoni ta' kodiċi ġdid. Bdejna b'suġġerimenti linter li ssuġġerew iż-żieda ta' annotazzjonijiet għal fajls li diġà kellhom xi annotazzjonijiet. Issa neħtieġu annotazzjonijiet tat-tip f'fajls Python ġodda u fil-biċċa l-kbira tal-fajls eżistenti.

Rapporti tat-tajping. Nibagħtu rapporti ta' kull ġimgħa lit-timijiet dwar il-livell ta' ttajpjar fil-kodiċi tagħhom u nagħtu pariri dwar x'għandu jiġi annotat l-ewwel.

Popolarizzazzjoni ta' mypy. Nitkellmu dwar mypy f'avvenimenti u nitkellmu mat-timijiet biex ngħinuhom jibdew b'annotazzjonijiet tat-tip.

Polls. Aħna nwettqu stħarriġ perjodiku tal-utenti biex nidentifikaw problemi kbar. Aħna lesti li mmorru pjuttost 'il bogħod biex insolvu dawn il-problemi (anke noħolqu lingwa ġdida biex tħaffef mypy!).

Prestazzjoni. Aħna tjiebna ħafna l-prestazzjoni ta 'mypy billi nużaw id-daemon u mypyc. Dan sar biex itaffu l-inkonvenjenzi li jinqalgħu matul il-proċess ta 'annotazzjoni, u sabiex tkun tista' taħdem b'ammonti kbar ta 'kodiċi.

Integrazzjoni mal-edituri. Bnejna għodod biex nappoġġjaw it-tħaddim ta' mypy f'edituri li huma popolari fuq Dropbox. Dan jinkludi PyCharm, Vim u VS Code. Dan issimplifika bil-kbir il-proċess ta' annotazzjoni tal-kodiċi u verifika tal-funzjonalità tiegħu. Dawn it-tipi ta' azzjonijiet huma komuni meta jiġu annotati kodiċi eżistenti.

Analiżi statika. Ħloqna għodda biex niddeduċu firem tal-funzjoni billi tuża għodod ta 'analiżi statika. Din l-għodda tista 'taħdem biss f'sitwazzjonijiet relattivament sempliċi, iżda għenitna nżidu l-kopertura tat-tip ta' kodiċi tagħna mingħajr ħafna sforz.

Appoġġ għal libreriji ta 'partijiet terzi. Ħafna mill-proġetti tagħna jużaw l-għodda SQLAlchemy. Huwa jieħu vantaġġ mill-kapaċitajiet dinamiċi ta 'Python li tipi PEP 484 ma jistgħux jimmudellaw direttament. Aħna, skont PEP 561, ħloqna l-fajl stub korrispondenti u ktibna plugin għal mypy (sors miftuħ), ittejjeb l-appoġġ SQLAlchemy.

Diffikultajiet li ltqajna magħhom

It-triq għal 4 miljun linja ta 'kodiċi ittajpjat mhux dejjem kienet faċli għalina. F’din it-triq iltqajna ma’ ħafna ħofor u għamilna diversi żbalji. Dawn huma wħud mill-problemi li ltqajna magħhom. Nittamaw li ngħidu dwarhom jgħin lil oħrajn jevitaw problemi simili.

Fajls nieqsa. Bdejna x-xogħol tagħna billi vverifikaw biss ammont żgħir ta 'fajls. Xi ħaġa mhux inkluża f'dawn il-fajls ma ġietx iċċekkjata. Il-fajls ġew miżjuda mal-lista tal-iskannjar meta dehru fihom l-ewwel annotazzjonijiet. Jekk xi ħaġa ġiet importata minn modulu li jinsab barra mill-ambitu tal-verifika, allura konna qed nitkellmu dwar il-ħidma b'valuri bħal Any, li ma ġew ittestjati xejn. Dan wassal għal telf sinifikanti ta' preċiżjoni tat-tajpjar, speċjalment fl-istadji bikrija tal-migrazzjoni. Dan l-approċċ ħadem tajjeb b'mod sorprendenti s'issa, għalkemm sitwazzjoni tipika hija li ż-żieda ta 'fajls fl-ambitu tar-reviżjoni tiżvela problemi f'partijiet oħra tal-kodiċi. Fl-agħar każ, meta żewġ żoni iżolati ta 'kodiċi ġew magħquda, li fihom, indipendentement minn xulxin, it-tipi kienu diġà ċċekkjati, irriżulta li t-tipi ta' dawn iż-żoni kienu inkompatibbli ma 'xulxin. Dan wassal għall-ħtieġa li jsiru ħafna bidliet fl-annotazzjonijiet. Meta nħarsu lura issa, aħna nirrealizzaw li għandna żidna moduli tal-librerija ewlenin fiż-żona ta 'kontroll tat-tip ta' mypy qabel. Dan jagħmel ix-xogħol tagħna ferm aktar prevedibbli.

L-annotazzjoni tal-kodiċi antik. Meta bdejna, kellna madwar 4 miljun linja ta 'kodiċi Python eżistenti. Kien ċar li l-annotazzjoni ta’ dan il-kodiċi kollu ma kinitx biċċa xogħol faċli. Ħloqna għodda msejħa PyAnnotate li tista' tiġbor informazzjoni tat-tip hekk kif isiru t-testijiet u tista' żżid annotazzjonijiet tat-tip mal-kodiċi tiegħek ibbażati fuq l-informazzjoni miġbura. Madankollu, aħna ma ndunajniex adozzjoni partikolarment mifruxa ta' din l-għodda. Il-ġbir tal-informazzjoni tat-tip kien bil-mod, u annotazzjonijiet iġġenerati awtomatikament ħafna drabi kienu jeħtieġu ħafna edits manwali. Ħsibna biex inħaddmu din l-għodda awtomatikament kull darba li nirrevedu l-kodiċi, jew niġbru informazzjoni tat-tip ibbażata fuq l-analiżi ta 'xi volum żgħir ta' talbiet tan-netwerk attwali, iżda ddeċidejna li ma tagħmilx dan għaliex kwalunkwe approċċ kien riskjuż wisq.

Bħala riżultat, jista 'jiġi nnotat li ħafna mill-kodiċi kien annotat manwalment mis-sidien tiegħu. Sabiex niggwidaw dan il-proċess fid-direzzjoni t-tajba, aħna nippreparaw rapporti dwar moduli u funzjonijiet partikolarment importanti li jeħtieġ li jiġu annotati. Pereżempju, huwa importanti li jiġu pprovduti annotazzjonijiet tat-tip għal modulu tal-librerija li jintuża f'mijiet ta' postijiet. Iżda servizz antik li qed jiġi sostitwit b'ieħor ġdid m'għadux daqshekk importanti li jiġi annotat. Qed nesperimentaw ukoll bl-użu ta' analiżi statika biex niġġeneraw annotazzjonijiet tat-tip għall-kodiċi tal-wirt.

Importazzjonijiet ċikliċi. Fuq, tkellimt dwar importazzjonijiet ċikliċi (it-"tħabbil tad-dipendenza"), li l-eżistenza tagħhom għamlitha diffiċli biex titħaffef mypy. Kellna wkoll naħdmu ħafna biex mypy jappoġġja kull tip ta 'idjomi li huma kkawżati minn dawn l-importazzjonijiet ċikliċi. Riċentement lestejna proġett kbir ta' disinn mill-ġdid tas-sistema li rranġa ħafna mill-kwistjonijiet ta' mypy dwar l-importazzjonijiet ċirkolari. Dawn il-problemi fil-fatt ħarġu mill-ewwel jiem tal-proġett, lura minn Alore, il-lingwa edukattiva li l-proġett mypy kien iffukat fuqha oriġinarjament. Is-sintassi ta' Alore tagħmilha faċli biex issolvi problemi bi kmandi ta' importazzjoni ċikliċi. Il-mypy moderna wiret xi limitazzjonijiet mill-implimentazzjoni preċedenti tagħha b'moħħha sempliċi (li kienet tajba ħafna għal Alore). Python jagħmel ix-xogħol ma' importazzjonijiet ċirkolari diffiċli, prinċipalment minħabba li l-espressjonijiet huma ambigwi. Pereżempju, operazzjoni ta' assenjazzjoni tista' fil-fatt tiddefinixxi alias tat-tip. Mypy mhux dejjem kapaċi jiskopri affarijiet bħal dawn sakemm il-biċċa l-kbira tal-linja tal-importazzjoni tkun ġiet ipproċessata. Ma kienx hemm ambigwitajiet bħal dawn f'Alore. Deċiżjonijiet ħżiena meħuda fl-istadji bikrija tal-iżvilupp tas-sistema jistgħu jippreżentaw sorpriża spjaċevoli lill-programmatur ħafna snin wara.

Riżultati: it-triq għal 5 miljun linja ta 'kodiċi u orizzonti ġodda

Il-proġett mypy mexa triq twila - minn prototipi bikrija għal sistema li tikkontrolla 4 miljun linja ta 'tipi ta' kodiċi ta 'produzzjoni. Hekk kif mypy evolviet, il-ħjiel tat-tip Python ġew standardizzati. Dawn il-ġranet, żviluppat ekosistema qawwija madwar it-tajpjar tal-kodiċi Python. Għandu post għall-appoġġ tal-librerija, fih għodod awżiljarji għal IDEs u edituri, għandu diversi sistemi ta 'kontroll tat-tip, li kull wieħed minnhom għandu l-vantaġġi u l-iżvantaġġi tiegħu.

Anki jekk l-iċċekkjar tat-tip diġà huwa mogħti fuq Dropbox, nemmen li għadna fil-jiem bikrija tat-tajpjar tal-kodiċi Python. Naħseb li t-teknoloġiji tal-iċċekkjar tat-tip se jkomplu jevolvu u jitjiebu.

Jekk ma tkunx diġà użajt l-iċċekkjar tat-tip fil-proġett Python fuq skala kbira tiegħek, allura taf li issa huwa żmien tajjeb ħafna biex tibda timxi lejn ittajpjar statiku. Tkellimt ma’ dawk li għamlu tranżizzjoni simili. Ħadd minnhom ma ddispjaċih. Il-verifika tat-tip tagħmel Python lingwa li hija ħafna aħjar adattata għall-iżvilupp ta 'proġetti kbar minn "Python regolari."

Għeżież qarrejja! Tuża l-iċċekkjar tat-tip fil-proġetti Python tiegħek?

It-triq għall-iċċekkjar tat-tip 4 miljun linja ta 'kodiċi Python. Parti 3
It-triq għall-iċċekkjar tat-tip 4 miljun linja ta 'kodiċi Python. Parti 3

Sors: www.habr.com

Żid kumment