PiedÄvÄjam jÅ«su uzmanÄ«bai treÅ”o daļu no materiÄla tulkojuma par ceļu, kuru Dropbox veica, ievieÅ”ot Python koda tipa pÄrbaudes sistÄmu.
ā IepriekÅ”ÄjÄs daļas:
Sasniedzot 4 miljonus ierakstÄ«tÄ koda rindiÅu
VÄl viens nozÄ«mÄ«gs izaicinÄjums (un otrais visbiežÄk sastopamais jautÄjums iekÅ”Äji aptaujÄto vidÅ«) bija palielinÄt koda daudzumu, uz kuru attiecas Dropbox tipa pÄrbaudes. MÄs esam izmÄÄ£inÄjuÅ”i vairÄkas pieejas, lai atrisinÄtu Å”o problÄmu, sÄkot ar dabisku drukÄtÄs kodu bÄzes lieluma palielinÄÅ”anu un beidzot ar mypy komandas centienu koncentrÄÅ”anu uz statisku un dinamisku automatizÄtu tipu secinÄjumu izdarÄ«Å”anu. Galu galÄ Å”Ä·ita, ka nav vienkÄrÅ”as uzvaras stratÄÄ£ijas, taÄu mÄs spÄjÄm panÄkt strauju anotÄtÄ koda apjoma pieaugumu, apvienojot daudzas pieejas.
RezultÄtÄ mÅ«su lielÄkajÄ Python repozitorijÄ (ar aizmugurkodu) ir gandrÄ«z 4 miljoni anotÄta koda rindu. Darbs pie statiskÄ koda rakstÄ«Å”anas tika pabeigts aptuveni trÄ«s gadu laikÄ. Mypy tagad atbalsta dažÄda veida koda pÄrklÄjuma pÄrskatus, kas atvieglo rakstÄ«Å”anas progresa pÄrraudzÄ«bu. Jo Ä«paÅ”i mÄs varam Ä£enerÄt pÄrskatus par kodu ar neskaidrÄ«bÄm tipos, piemÄram, piemÄram, nepÄrprotami izmantotu veidu. Any
anotÄcijÄs, kuras nevar pÄrbaudÄ«t, vai ar tÄdÄm lietÄm kÄ treÅ”o puÅ”u bibliotÄku importÄÅ”ana, kurÄm nav tipa anotÄciju. KÄ daļu no projekta, lai uzlabotu Dropbox tipa pÄrbaudes precizitÄti, mÄs palÄ«dzÄjÄm uzlabot tipu definÄ«cijas (tÄ sauktos stub failus) dažÄm populÄrÄm atvÄrtÄ pirmkoda bibliotÄkÄm centralizÄtÄ Python repozitorijÄ.
MÄs ieviesÄm (un standartizÄjÄm turpmÄkajos PEP) jaunas tipa sistÄmas funkcijas, kas ļauj noteikt precÄ«zÄkus veidus dažiem konkrÄtiem Python modeļiem. IevÄrojams piemÄrs tam ir TypeDict
, kas nodroÅ”ina veidus JSON lÄ«dzÄ«gÄm vÄrdnÄ«cÄm, kurÄm ir fiksÄta virkÅu atslÄgu kopa, katrai no kurÄm ir sava veida vÄrtÄ«ba. MÄs turpinÄsim paplaÅ”inÄt tipu sistÄmu. MÅ«su nÄkamais solis, visticamÄk, bÅ«s uzlabot atbalstu Python skaitliskajÄm iespÄjÄm.
AnotÄtÄ koda rindu skaits: serveris
AnotÄtÄ koda rindu skaits: klients
KopÄjais anotÄtÄ koda rindiÅu skaits
TÄlÄk ir sniegts pÄrskats par galvenajÄm funkcijÄm, ko veicÄm, lai palielinÄtu anotÄtÄ koda daudzumu pakalpojumÄ Dropbox.
AnotÄcijas stingrÄ«ba. MÄs pakÄpeniski palielinÄjÄm prasÄ«bas attiecÄ«bÄ uz jaunÄ koda anotÄÅ”anas stingrÄ«bu. MÄs sÄkÄm ar lintera padomiem, kas ieteica pievienot anotÄcijas failiem, kuriem jau bija dažas anotÄcijas. Tagad mums ir nepiecieÅ”amas tipa anotÄcijas jaunajos Python failos un lielÄkajÄ daÄ¼Ä esoÅ”o failu.
PÄrskatu rakstÄ«Å”ana. MÄs nosÅ«tÄm komandÄm iknedÄļas ziÅojumus par to koda ievadÄ«Å”anas lÄ«meni un sniedzam padomus par to, kas vispirms bÅ«tu jÄanotÄ.
Mypy popularizÄÅ”ana. MÄs runÄjam par mypy pasÄkumos un runÄjam ar komandÄm, lai palÄ«dzÄtu viÅiem sÄkt darbu ar veidu anotÄcijÄm.
Aptaujas. MÄs veicam periodiskas lietotÄju aptaujas, lai identificÄtu galvenÄs problÄmas. MÄs esam gatavi iet diezgan tÄlu, risinot Ŕīs problÄmas (pat izveidojot jaunu valodu, lai paÄtrinÄtu mypy!).
Performance. MÄs esam ievÄrojami uzlabojuÅ”i mypy veiktspÄju, izmantojot dÄmonu un mypyc. Tas tika darÄ«ts, lai izlÄ«dzinÄtu neÄrtÄ«bas, kas rodas anotÄcijas procesÄ, un lai varÄtu strÄdÄt ar lielu koda daudzumu.
IntegrÄcija ar redaktoriem. MÄs esam izveidojuÅ”i rÄ«kus, lai atbalstÄ«tu mypy palaiÅ”anu redaktoros, kas ir populÄri pakalpojumÄ Dropbox. Tas ietver PyCharm, Vim un VS kodu. Tas ievÄrojami vienkÄrÅ”oja koda anotÄÅ”anas un tÄ funkcionalitÄtes pÄrbaudes procesu. Å Äda veida darbÄ«bas ir izplatÄ«tas, anotÄjot esoÅ”o kodu.
StatiskÄ analÄ«ze. MÄs izveidojÄm rÄ«ku funkciju parakstu izsecinÄÅ”anai, izmantojot statiskÄs analÄ«zes rÄ«kus. Å is rÄ«ks var darboties tikai salÄ«dzinoÅ”i vienkÄrÅ”Äs situÄcijÄs, taÄu tas mums palÄ«dzÄja bez lielÄm pÅ«lÄm palielinÄt koda veidu pÄrklÄjumu.
Atbalsts treÅ”o puÅ”u bibliotÄkÄm. Daudzos mÅ«su projektos tiek izmantots SQLAlchemy rÄ«ku komplekts. Tas izmanto Python dinamiskÄs iespÄjas, kuras PEP 484 tipi nespÄj tieÅ”i modelÄt. MÄs saskaÅÄ ar PEP 561 izveidojÄm atbilstoÅ”o stub failu un uzrakstÄ«jÄm spraudni mypy (
GrÅ«tÄ«bas, ar kurÄm saskÄrÄmies
CeļŔ uz 4 miljoniem ierakstÄ«ta koda rindiÅu mums ne vienmÄr ir bijis viegls. Å ajÄ ceÄ¼Ä mÄs sastapÄmies ar daudzÄm bedrÄm un pieļÄvÄm vairÄkas kļūdas. Å Ä«s ir dažas no problÄmÄm, ar kurÄm mÄs saskÄrÄmies. MÄs ceram, ka stÄstÄ«Å”ana par tÄm palÄ«dzÄs citiem izvairÄ«ties no lÄ«dzÄ«gÄm problÄmÄm.
TrÅ«kst failu. MÄs sÄkÄm darbu, pÄrbaudot tikai nelielu failu daudzumu. Nekas, kas nav iekļauts Å”ajos failos, netika pÄrbaudÄ«ts. Faili tika pievienoti skenÄÅ”anas sarakstam, kad tajos parÄdÄ«jÄs pirmÄs anotÄcijas. Ja kaut kas tika importÄts no moduļa, kas atrodas Ärpus verifikÄcijas jomas, tad mÄs runÄjÄm par darbu ar tÄdÄm vÄrtÄ«bÄm kÄ Any
, kas vispÄr netika pÄrbaudÄ«ti. Tas izraisÄ«ja ievÄrojamu rakstÄ«Å”anas precizitÄtes zudumu, Ä«paÅ”i migrÄcijas sÄkumposmÄ. Å Ä« pieeja lÄ«dz Å”im ir strÄdÄjusi pÄrsteidzoÅ”i labi, lai gan tipiska situÄcija ir tÄda, ka failu pievienoÅ”ana pÄrskatÄ«Å”anas jomai atklÄj problÄmas citÄs kodu bÄzes daļÄs. SliktÄkajÄ gadÄ«jumÄ, kad tika apvienoti divi izolÄti koda apgabali, kuros neatkarÄ«gi viens no otra jau tika pÄrbaudÄ«ti tipi, izrÄdÄ«jÄs, ka Å”o apgabalu veidi nav savstarpÄji savienojami. Tas radÄ«ja nepiecieÅ”amÄ«bu veikt daudzas izmaiÅas anotÄcijÄs. Atskatoties tagad, mÄs saprotam, ka mums vajadzÄja ÄtrÄk pievienot galvenos bibliotÄkas moduļus mypy tipa pÄrbaudes apgabalam. Tas padarÄ«tu mÅ«su darbu daudz paredzamÄku.
VecÄ koda anotÄÅ”ana. Kad mÄs sÄkÄm, mums bija aptuveni 4 miljoni esoÅ”Ä Python koda rindu. Bija skaidrs, ka visa Ŕī koda anotÄÅ”ana nebija viegls uzdevums. MÄs esam izveidojuÅ”i rÄ«ku PyAnnotate, kas var apkopot tipa informÄciju testu laikÄ un var pievienot tipa anotÄcijas jÅ«su kodam, pamatojoties uz savÄkto informÄciju. TomÄr mÄs neesam pamanÄ«juÅ”i Ä«paÅ”i plaÅ”u Ŕī rÄ«ka ievieÅ”anu. Veida informÄcijas vÄkÅ”ana bija lÄna, un automÄtiski Ä£enerÄtÄs anotÄcijas bieži vien bija jÄveic manuÄli. MÄs domÄjÄm par Ŕī rÄ«ka automÄtisku palaiÅ”anu ikreiz, kad pÄrskatÄm kodu, vai apkopojÄm veidu informÄciju, pamatojoties uz nelielu faktisko tÄ«kla pieprasÄ«jumu skaita analÄ«zi, taÄu nolÄmÄm to nedarÄ«t, jo abas pieejas bija pÄrÄk riskantas.
RezultÄtÄ var atzÄ«mÄt, ka lielÄko daļu koda manuÄli anotÄja tÄ Ä«paÅ”nieki. Lai virzÄ«tu Å”o procesu pareizajÄ virzienÄ, mÄs sagatavojam atskaites par Ä«paÅ”i svarÄ«giem moduļiem un funkcijÄm, kuras ir jÄanotÄ. PiemÄram, ir svarÄ«gi nodroÅ”inÄt tipa anotÄcijas bibliotÄkas modulim, kas tiek izmantots simtiem vietu. Bet vecs pakalpojums, kas tiek aizstÄts ar jaunu, vairs nav tik svarÄ«gs, lai komentÄtu. MÄs arÄ« eksperimentÄjam ar statiskÄs analÄ«zes izmantoÅ”anu, lai Ä£enerÄtu tipa anotÄcijas mantotajam kodam.
Ciklisks imports. IepriekÅ” es runÄju par ciklisko importu (āatkarÄ«bas samezglojumiemā), kuru esamÄ«ba apgrÅ«tinÄja mypy paÄtrinÄÅ”anu. Mums bija arÄ« smagi jÄstrÄdÄ, lai mypy atbalstÄ«tu visa veida idiomas, ko izraisa Å”is cikliskais imports. MÄs nesen pabeidzÄm lielu sistÄmas pÄrprojektÄÅ”anas projektu, kas atrisinÄja lielÄko daļu mypy problÄmu saistÄ«bÄ ar cirkulÄro importu. Å Ä«s problÄmas patiesÄ«bÄ radÄs projekta pirmajÄs dienÄs, sÄkot no Alore, izglÄ«tojoÅ”Äs valodas, uz kuru sÄkotnÄji tika vÄrsts projekts mypy. Alore sintakse atvieglo problÄmu risinÄÅ”anu ar cikliskÄm importÄÅ”anas komandÄm. MÅ«sdienu mypy ir mantojis dažus ierobežojumus no tÄs agrÄkÄs, vienkÄrÅ”Äs ievieÅ”anas (kas bija lieliski piemÄrota Alore). Python apgrÅ«tina darbu ar apļveida importÄÅ”anu, galvenokÄrt tÄpÄc, ka izteiksmes ir neskaidras. PiemÄram, pieŔķirÅ”anas darbÄ«ba faktiski var definÄt tipa aizstÄjvÄrdu. Mypy ne vienmÄr spÄj noteikt Å”Ädas lietas, kamÄr lielÄkÄ daļa importÄÅ”anas cilpas nav apstrÄdÄta. AlorÄ tÄdas neskaidrÄ«bas nebija. Slikti lÄmumi, kas pieÅemti sistÄmas izstrÄdes sÄkumposmÄ, programmÄtÄjam var sagÄdÄt nepatÄ«kamu pÄrsteigumu daudzus gadus vÄlÄk.
RezultÄti: ceļŔ uz 5 miljoniem koda rindu un jauniem apvÄrÅ”Åiem
Mypy projekts ir nogÄjis garu ceļu ā no agrÄ«niem prototipiem lÄ«dz sistÄmai, kas kontrolÄ 4 miljonus ražoÅ”anas kodu veidu rindu. AttÄ«stoties mypy, Python tipa padomi tika standartizÄti. MÅ«sdienÄs Python koda ievadÄ«Å”anai ir izveidojusies spÄcÄ«ga ekosistÄma. TajÄ ir vieta bibliotÄku atbalstam, tajÄ ir IDE un redaktoru palÄ«grÄ«ki, ir vairÄkas tipa vadÄ«bas sistÄmas, no kurÄm katrai ir savi plusi un mÄ«nusi.
Lai gan Dropbox tipa pÄrbaude jau ir noteikta, es uzskatu, ka mÄs joprojÄm esam Python koda ievadÄ«Å”anas sÄkumÄ. Es domÄju, ka tipa pÄrbaudes tehnoloÄ£ijas turpinÄs attÄ«stÄ«ties un uzlaboties.
Ja savÄ lielapjoma Python projektÄ vÄl neesat izmantojis tipa pÄrbaudi, ziniet, ka tagad ir ļoti piemÄrots brÄ«dis, lai sÄktu pÄriet uz statisko rakstÄ«Å”anu. Esmu runÄjis ar tiem, kuri ir veikuÅ”i lÄ«dzÄ«gu pÄreju. Neviens no viÅiem to nenožÄloja. Tipa pÄrbaude padara Python par valodu, kas ir daudz labÄk piemÄrota lielu projektu izstrÄdei nekÄ āparastais Pythonā.
CienÄ«jamie lasÄ«tÄji! Vai savos Python projektos izmantojat tipa pÄrbaudi?
Avots: www.habr.com