Predstavljamo vam treÄi dio prijevoda materijala o putu koji je Dropbox proÅ”ao prilikom implementacije sustava provjere tipa za Python kod.
ā Prethodni dijelovi: Šø
Dosezanje 4 milijuna redaka tipkanog koda
JoÅ” jedan veliki izazov (i druga najÄeÅ”Äa briga interno ispitanih) bilo je poveÄanje koliÄine koda pokrivenog provjerama tipa u Dropboxu. Isprobali smo nekoliko pristupa rjeÅ”avanju ovog problema, od prirodnog poveÄanja veliÄine unesene baze koda do fokusiranja napora mypy tima na statiÄko i dinamiÄko automatsko zakljuÄivanje tipa. Na kraju se Äinilo da nema jednostavne pobjedniÄke strategije, ali uspjeli smo postiÄi brzi rast koliÄine oznaÄenog koda kombinirajuÄi mnoge pristupe.
Kao rezultat toga, naÅ”e najveÄe Python spremiÅ”te (s pozadinskim kodom) ima gotovo 4 milijuna redaka oznaÄenog koda. Radovi na statiÄkom tipiziranju koda zavrÅ”eni su za otprilike tri godine. Mypy sada podržava razliÄite vrste izvjeÅ”Äa o pokrivenosti koda koji olakÅ”avaju praÄenje napretka tipkanja. Konkretno, možemo generirati izvjeÅ”Äa o kodu s dvosmislenostima u tipovima, kao Å”to je, na primjer, eksplicitna upotreba tipa Any u primjedbama koje se ne mogu provjeriti ili sa stvarima poput uvoza biblioteka treÄih strana koje nemaju primjedbe tipa. Kao dio projekta za poboljÅ”anje toÄnosti provjere tipa u Dropboxu, pridonijeli smo poboljÅ”anju definicija tipa (tzv. stub datoteke) za neke popularne biblioteke otvorenog koda u centraliziranom Python repozitoriju .
Implementirali smo (i standardizirali u sljedeÄim PEP-ovima) nove znaÄajke sustava tipova koje omoguÄuju preciznije tipove za neke specifiÄne Python obrasce. ZnaÄajan primjer za to je TypeDict, koji pruža tipove za rjeÄnike sliÄne JSON-u koji imaju fiksni skup nizovnih kljuÄeva, svaki s vrijednoÅ”Äu vlastitog tipa. Nastavit Äemo Å”iriti sustav tipova. NaÅ” sljedeÄi korak vjerojatno Äe biti poboljÅ”anje podrÅ”ke za numeriÄke moguÄnosti Pythona.

Broj redaka oznaÄenog koda: poslužitelj

Broj redaka oznaÄenog koda: klijent

Ukupan broj redaka oznaÄenog koda
Evo pregleda glavnih znaÄajki stvari koje smo uÄinili kako bismo poveÄali koliÄinu oznaÄenog koda u Dropboxu:
Strogost primjedbi. Postupno smo poveÄavali zahtjeve za rigoroznoÅ”Äu oznaÄavanja novog koda. ZapoÄeli smo sa savjetima za linter koji su sugerirali dodavanje komentara datotekama koje su veÄ imale neke komentare. Sada zahtijevamo komentare tipa u novim Python datotekama i u veÄini postojeÄih datoteka.
Tipkanje izvjeÅ”Äa. Å aljemo timovima tjedna izvjeÅ”Äa o razini upisivanja koda i dajemo savjete o tome Å”to bi prvo trebalo oznaÄiti.
Popularizacija mypyja. Razgovaramo o mypy na dogaÄajima i razgovaramo s timovima kako bismo im pomogli da poÄnu s primjedbama tipa.
Ankete. Provodimo periodiÄne ankete korisnika kako bismo identificirali glavne probleme. Spremni smo iÄi priliÄno daleko u rjeÅ”avanju ovih problema (Äak i stvoriti novi jezik za ubrzavanje mypy!).
IzvoÄenje. Uvelike smo poboljÅ”ali izvedbu mypyja koriÅ”tenjem demona i mypyca. To je uÄinjeno kako bi se izgladile neugodnosti koje nastaju tijekom procesa oznaÄavanja i kako bi se mogao raditi s velikim koliÄinama koda.
Integracija s urednicima. Napravili smo alate za podrÅ”ku pokretanja mypyja u ureÄivaÄima koji su popularni na Dropboxu. To ukljuÄuje PyCharm, Vim i VS Code. Ovo je uvelike pojednostavilo proces oznaÄavanja koda i provjere njegove funkcionalnosti. Ove vrste radnji uobiÄajene su prilikom oznaÄavanja postojeÄeg koda.
StatiÄka analiza. Napravili smo alat za zakljuÄivanje potpisa funkcija pomoÄu alata za statiÄku analizu. Ovaj alat može raditi samo u relativno jednostavnim situacijama, ali nam je pomogao da poveÄamo pokrivenost tipa koda bez puno truda.
PodrÅ”ka za biblioteke treÄih strana. Mnogi naÅ”i projekti koriste SQLAlchemy toolkit. IskoriÅ”tava prednosti dinamiÄkih moguÄnosti Pythona koje vrste PEP 484 ne mogu izravno modelirati. Mi smo, u skladu s PEP 561, kreirali odgovarajuÄu stub datoteku i napisali dodatak za mypy (), Å”to poboljÅ”ava podrÅ”ku za SQLAlchemy.
PoteÅ”koÄe na koje smo naiÅ”li
Put do 4 milijuna redaka tipkanog koda nije nam uvijek bio lak. Na ovoj smo stazi naiÅ”li na mnoge rupe i napravili nekoliko greÅ”aka. Ovo su neki od problema s kojima smo se susreli. Nadamo se da Äe priÄanje o njima pomoÄi drugima da izbjegnu sliÄne probleme.
Nedostaju datoteke. ZapoÄeli smo s radom provjerom samo male koliÄine datoteka. Sve Å”to nije ukljuÄeno u ove datoteke nije provjereno. Datoteke su dodane na popis za skeniranje kada su se u njima pojavile prve zabiljeÅ”ke. Ako je neÅ”to uvezeno iz modula koji se nalazi izvan opsega provjere, tada smo govorili o radu s vrijednostima poput Any, koji uopÄe nisu testirani. To je dovelo do znaÄajnog gubitka toÄnosti tipkanja, posebno u ranim fazama migracije. Ovaj je pristup do sada funkcionirao iznenaÄujuÄe dobro, iako je tipiÄna situacija da dodavanje datoteka u opseg pregleda otkriva probleme u drugim dijelovima baze koda. U najgorem sluÄaju, kada su spojena dva izolirana podruÄja koda, u kojima su tipovi veÄ bili provjereni neovisno jedno o drugom, pokazalo se da su tipovi tih podruÄja meÄusobno nekompatibilni. To je dovelo do potrebe za uvoÄenjem mnogih izmjena u komentare. GledajuÄi sada unatrag, shvaÄamo da smo trebali dodati osnovne module knjižnice u mypyjevo podruÄje provjere tipa ranije. To bi naÅ” rad uÄinilo mnogo predvidljivijim.
OznaÄavanje starog koda. Kad smo poÄeli, imali smo oko 4 milijuna redaka postojeÄeg Python koda. Bilo je jasno da oznaÄavanje cijelog tog koda nije lak zadatak. Napravili smo alat pod nazivom PyAnnotate koji može prikupljati informacije o tipu dok se testovi izvode i može dodati komentare tipa vaÅ”em kodu na temelju prikupljenih informacija. MeÄutim, nismo primijetili posebno Å”iroku primjenu ovog alata. Prikupljanje informacija o vrsti bilo je sporo, a automatski generirane zabiljeÅ”ke Äesto su zahtijevale mnogo ruÄnih izmjena. RazmiÅ”ljali smo o automatskom pokretanju ovog alata svaki put kada pregledavamo kĆ“d ili prikupljanju informacija o vrsti na temelju analize neke male koliÄine stvarnih mrežnih zahtjeva, ali odluÄili smo da to neÄemo uÄiniti jer je oba pristupa previÅ”e riskantna.
Kao rezultat toga, može se primijetiti da su veÄinu koda njegovi vlasnici ruÄno oznaÄili. Kako bismo vodili ovaj proces u pravom smjeru, pripremamo izvjeÅ”Äa o posebno važnim modulima i funkcijama koje je potrebno oznaÄiti. Na primjer, važno je osigurati tipske biljeÅ”ke za modul knjižnice koji se koristi na stotinama mjesta. Ali stara usluga koja se zamjenjuje novom viÅ”e nije toliko važna za oznaÄavanje. TakoÄer eksperimentiramo s koriÅ”tenjem statiÄke analize za generiranje tipskih komentara za naslijeÄeni kod.
CikliÄni uvozi. Gore sam govorio o cikliÄkim uvozima ("zapletima ovisnosti"), Äije je postojanje otežavalo ubrzanje mypyja. TakoÄer smo morali naporno raditi kako bi mypy podržavao sve vrste idioma koji su uzrokovani ovim cikliÄkim uvozom. Nedavno smo dovrÅ”ili veliki projekt redizajna sustava koji je rijeÅ”io veÄinu mypyjevih problema u vezi s kružnim uvozom. Ovi su problemi zapravo proizaÅ”li iz ranih dana projekta, joÅ” iz Alorea, obrazovnog jezika na koji je mypy projekt izvorno bio fokusiran. Alore sintaksa olakÅ”ava rjeÅ”avanje problema s cikliÄkim uvoznim naredbama. Moderni mypy naslijedio je neka ograniÄenja od svoje ranije, jednostavne implementacije (koja je bila sjajna za Alore). Python otežava rad s kružnim uvozima, uglavnom zato Å”to su izrazi dvosmisleni. Na primjer, operacija dodjele može zapravo definirati alias tipa. Mypy nije uvijek u stanju otkriti ovakve stvari dok se veÄina petlje uvoza ne obradi. U Aloreu nije bilo takvih nejasnoÄa. LoÅ”e odluke donesene u ranim fazama razvoja sustava mogu predstavljati neugodno iznenaÄenje programeru mnogo godina kasnije.
Rezultati: put do 5 milijuna redaka koda i novi horizonti
Projekt mypy proÅ”ao je dug put - od ranih prototipova do sustava koji kontrolira 4 milijuna linija tipova proizvodnog koda. Kako se mypy razvijao, Pythonovi tipovi su standardizirani. Ovih se dana razvio snažan ekosustav oko upisivanja Python koda. Ima mjesto za podrÅ”ku knjižnici, sadrži pomoÄne alate za IDE i urednike, ima nekoliko sustava kontrole tipa, od kojih svaki ima svoje prednosti i nedostatke.
Iako je provjera tipa veÄ zadana u Dropboxu, vjerujem da smo joÅ” uvijek u ranim danima upisivanja Python koda. Mislim da Äe se tehnologije provjere tipa nastaviti razvijati i poboljÅ”avati.
Ako joÅ” niste koristili provjeru tipa u svom velikom Python projektu, znajte da je sada jako dobro vrijeme da poÄnete prelaziti na statiÄno tipkanje. Razgovarao sam s onima koji su napravili sliÄnu tranziciju. Nitko od njih nije požalio. Provjera tipa Äini Python jezikom koji je mnogo prikladniji za razvoj velikih projekata od "obiÄnog Pythona".
Dragi Äitatelji! Koristite li provjeru tipa u svojim Python projektima?
Izvor: www.habr.com
