Indlela yokuhlola imigqa eyizigidi ezi-4 yekhodi yePython. Ingxenye 2

Namuhla sishicilela ingxenye yesibili yokuhunyushwa kwezinto ezimayelana nendlela iDropbox ehlele ngayo ukulawula uhlobo lwemigqa eyizigidi ezimbalwa yekhodi yePython.

Indlela yokuhlola imigqa eyizigidi ezi-4 yekhodi yePython. Ingxenye 2

β†’ Funda ingxenye yokuqala

Ukwesekwa kohlobo olusemthethweni (PEP 484)

Senze ucwaningo lwethu lokuqala olubucayi nge-mypy e-Dropbox phakathi neviki lika-Hack 2014. I-Hack Week umcimbi weviki elilodwa elisingathwa yi-Dropbox. Ngalesi sikhathi, abasebenzi bangasebenza kunoma yini abayifunayo! Amanye amaphrojekthi wezobuchwepheshe adume kakhulu e-Dropbox aqale emicimbini efana nalena. Njengomphumela walokhu kuhlolwa, siphethe ngokuthi i-mypy ibukeka ithembisa, nakuba iphrojekthi ingakalungeli ukusetshenziswa kabanzi.

Ngaleso sikhathi, umqondo wokulinganisa amasistimu wokusikisela wePython wawusemoyeni. Njengoba ngishilo, njengoba i-Python 3.0 bekungenzeka ukusebenzisa izichasiselo zohlobo zemisebenzi, kodwa lezi bekuyizinkulumo nje ezingenangqondo, ngaphandle kwe-syntax echaziwe kanye ne-semantics. Ngesikhathi sokwenziwa kohlelo, lezi zichasiselo, ingxenye enkulu, bezimane zinganakwa. Ngemva Hack Week, saqala ukusebenza on standardizing semantics. Lo msebenzi uholele ekuveleni Idatha ye-PE484 (Mina no-Guido van Rossum, Łukasz Langa sibambisene nalo mbhalo).

Izisusa zethu zingabhekwa ngezinhlangothi ezimbili. Okokuqala, besithemba ukuthi yonke i-ecosystem ye-Python ingase isebenzise indlela evamile yokusebenzisa amacebo ohlobo (igama elisetshenziswe ku-Python njengelilingana "nohlobo lwezichasiselo"). Lokhu, uma kubhekwa izingozi ezingaba khona, kungaba ngcono kunokusebenzisa izindlela eziningi ezingahambelani. Okwesibili, besifuna ukuxoxa ngokukhululekile ngezindlela zezichasiselo zohlobo namalungu amaningi omphakathi wePython. Lesi sifiso sasinqunywa ngokwengxenye ukuthi sasingafuni ukubukeka β€œnjengabahlubuki” emibonweni eyisisekelo yolimi emehlweni oquqaba lwabahleli bezinhlelo zePython. Iwulimi oluthayiphiwe ngokushintshashintshayo, olwaziwa ngele-"duck typing". Emphakathini, ekuqaleni, isimo sengqondo esisolisayo mayelana nomqondo wokuthayipha okumile asikwazanga ukusiza kodwa sivele. Kodwa lowo muzwa wagcina unciphile ngemva kokuba sekucacile ukuthi ukuthayipha okumile bekungeke kube impoqo (nangemva kokuba abantu bebonile ukuthi kuwusizo ngempela).

I-syntax yokusikisela yohlobo eyagcina yamukelwa yayifana kakhulu naleyo eyayisekelwa yi-mypy ngaleso sikhathi. I-PEP 484 ikhishwe ngePython 3.5 ngo-2015. I-Python yayingaselona ulimi oluthayiphiwe ngokushintshashintshayo. Ngithanda ukucabanga ngalo mcimbi njengengqophamlando ebalulekile emlandweni wePython.

Ukuqala kokufuduka

Ekupheleni kuka-2015, iDropbox yakha iqembu labantu abathathu abazosebenza ku-mypy. Bahlanganisa uGuido van Rossum, uGreg Price noDavid Fisher. Kusukela ngaleso sikhathi kuqhubeke, isimo saqala ukukhula ngokushesha okukhulu. Isithiyo sokuqala ekukhuleni kwe-mypy kwaba ukusebenza. Njengoba ngishilo ngenhla, ezinsukwini zokuqala zephrojekthi ngacabanga ngokuhumusha ukuqaliswa kwe-mypy ku-C, kodwa lo mbono weqiwa ohlwini okwamanje. Besibambeke ekusebenziseni uhlelo sisebenzisa umtoliki we-CPython, ongasheshi ngokwanele kumathuluzi afana ne-mypy. (Iphrojekthi ye-PyPy, enye indlela yokusebenzisa iPython nge-JIT compiler, ayizange isisize nathi.)

Ngenhlanhla, okunye ukuthuthukiswa kwe-algorithmic kusisize lapha. β€œIsisheshisi” sokuqala esinamandla kwakuwukuqaliswa kokuhlola okukhuphukayo. Umqondo walokhu kuthuthukiswa ubulula: uma konke ukuncika kwemojula kungashintshile kusukela ekuqaleni kwe-mypy, singasebenzisa idatha egcinwe kunqolobane ngesikhathi sokusebenza kwangaphambilini ngenkathi sisebenza ngokuncika. Besidinga kuphela ukuhlola uhlobo lwamafayela ashintshiwe nasemafayilini ancike kuwo. I-Mypy yaze yaqhubekela phambili kancane: uma ukusebenzelana kwangaphandle kwemojula kungashintshi, i-mypy icabange ukuthi amanye amamojula angenise le moduli awadingi ukuphinde ahlolwe.

Ukuhlola okwandayo kusisize kakhulu lapho sichaza amanani amakhulu ekhodi ekhona. Iphuzu liwukuthi le nqubo ngokuvamile ihilela ukugijima okuningi okuphindaphindiwe kwe-mypy njengoba izichasiselo zengezwa kancane kancane kukhodi futhi zithuthukiswa kancane kancane. Ukugijima kokuqala kwe-mypy kwakusahamba kancane ngoba kwakunokuncika okuningi okufanele kuhlolwe. Ngemva kwalokho, ukuze sithuthukise isimo, sisebenzise indlela yokulondoloza isikhashana esikude. Uma i-mypy ithola ukuthi inqolobane yasendaweni kungenzeka ukuthi idlulelwe yisikhathi, ilanda isifinyezo senqolobane yamanje yayo yonke i-codebase endaweni emaphakathi. Ibese yenza ukuhlola okukhuphukayo isebenzisa lesi sifinyezo. Lokhu kusithathele esinye isinyathelo esikhulu ekwandiseni ukusebenza kwe-mypy.

Lesi kwakuyinkathi yokwamukelwa ngokushesha nangemvelo kokuhlolwa kohlobo kwaDropbox. Ekupheleni kuka-2016, sase sinemigqa elinganiselwa ku-420000 yekhodi yePython enezichasiselo zohlobo. Abasebenzisi abaningi bebenomdlandla ngokuhlola uhlobo. Amaqembu amaningi okuthuthukisa abesebenzisa i-Dropbox mypy.

Konke kwakubukeka kukuhle ngaleso sikhathi, kodwa kwakusekuningi okwakusamelwe sikwenze. Saqala ukwenza izinhlolovo zangaphakathi ngezikhathi ezithile ukuze sithole izindawo eziyinkinga zephrojekthi futhi siqonde ukuthi yiziphi izinkinga okufanele zixazululwe kuqala (lo mkhuba usasetshenziswa enkampanini namuhla). Okubaluleke kakhulu, njengoba kwacaca, kwakuyimisebenzi emibili. Okokuqala, besidinga uhlobo oluningi lokumbozwa kwekhodi, okwesibili, sidinga i-mypy ukuze isebenze ngokushesha. Bekucace bha ukuthi umsebenzi wethu wokusheshisa i-mypy nokuwusebenzisa kumaphrojekthi enkampani ubungakaqedi. Thina, sikwazi ngokugcwele ukubaluleka kwale misebenzi emibili, saqala ukuyixazulula.

Ukukhiqiza okwengeziwe!

Ukuhlola okwenyukayo kwenza i-mypy yashesha, kodwa ithuluzi lalingasheshi ngokwanele. Ukuhlola okuningi okukhuphukayo kuthathe cishe iminithi. Isizathu salokhu bekungukungeniswa kwamanye amazwe ngomjikelezo. Lokhu cishe ngeke kumangaze noma ngubani osebenze nama-codebases amakhulu abhalwe ngePython. Sibe namasethi amakhulu wamamojula, ngalinye lawo lingenise ngokungaqondile wonke amanye. Uma noma yiliphi ifayela ku-loop yokungenisa lishintshiwe, i-mypy kwakudingeka icubungule wonke amafayela kuleyo loop, futhi ngokuvamile noma yimaphi amamojula angenisa amamojula kuleyo loop. Omunye umjikelezo onjalo bekuyi-"dependency tangle" edume kabi eyadala izinkinga eziningi kwaDropbox. Uma lesi sakhiwo siqukethe amamojula angamakhulu amaningana, ngenkathi singeniswa, ngokuqondile noma ngokungaqondile, izivivinyo eziningi, sasiphinde sisetshenziswe kukhodi yokukhiqiza.

Sicabangele ithuba "lokuqaqa" ukuncika okuyindilinga, kodwa besingenazo izinsiza zokukwenza. Bekunamakhodi amaningi kakhulu ebesingawajwayele. Ngenxa yalokho, siqhamuke nenye indlela. Sinqume ukwenza umsebenzi we-mypy ngokushesha ngisho nalapho kukhona "i-dependency tangles". Sifinyelele lo mgomo sisebenzisa i-mypy daemon. I-daemon iyinqubo yeseva esebenzisa izici ezimbili ezithakazelisayo. Okokuqala, igcina ulwazi mayelana nayo yonke isisekelo sekhodi kumemori. Lokhu kusho ukuthi ngaso sonke isikhathi uma usebenzisa i-mypy, awudingi ukulayisha idatha egcinwe kunqolobane ehlobene nezinkulungwane zokuncika okungenisiwe. Okwesibili, ngokucophelela, ezingeni lamayunithi amancane esakhiwo, uhlaziya ukuncika phakathi kwemisebenzi nezinye izinhlangano. Ngokwesibonelo, uma umsebenzi foo ibiza umsebenzi bar, bese kuba khona ukuncika foo kusukela bar. Lapho ifayela lishintsha, i-daemon kuqala, ngokuhlukaniswa, icubungula ifayela elishintshiwe kuphela. Bese ibheka izinguquko ezibonakala ngaphandle kulelo fayela, njengamasignisha omsebenzi ashintshiwe. I-daemon isebenzisa ulwazi oluningiliziwe mayelana nokungenisa kuphela ukuze ihlole kabili leyo misebenzi esebenzisa umsebenzi oguquliwe. Ngokuvamile, ngale ndlela, kufanele uhlole imisebenzi embalwa kakhulu.

Ukwenza konke lokhu kwakungelula, njengoba ukuqaliswa kwe-mypy yasekuqaleni kwakugxile kakhulu ekucubunguleni ifayela elilodwa ngesikhathi. Kwakudingeka sibhekane nezimo eziningi zemingcele, ukwenzeka kwazo okwakudinga ukuhlolwa okuphindaphindiwe ezimeni lapho okuthile kushintshile kukhodi. Isibonelo, lokhu kwenzeka lapho ikilasi labelwe isigaba sesisekelo esisha. Uma sesenze lokho ebesikufuna, sikwazile ukunciphisa isikhathi sokwenza ukuhlola okuningi okukhuphukayo sibe imizuzwana embalwa. Lokhu kwabonakala kuwukunqoba okukhulu kithi.

Ukukhiqiza okwengeziwe!

Kanye ne-caching ekude engixoxile ngayo ngenhla, i-mypy daemon icishe yaxazulula izinkinga eziphakama lapho umhleli evame ukugijima ukuhlola uhlobo, enze izinguquko enanini elincane lamafayela. Kodwa-ke, ukusebenza kwesistimu esimweni sokusebenzisa okuhle kakhulu bekusekude kakhulu nokulunga. Ukuqalisa okuhlanzekile kwe-mypy kungathatha imizuzu engaphezu kwe-15. Futhi lokhu bekungaphezu kwalokho ebesingajabula ngakho. Njalo ngesonto isimo saba sibi kakhulu njengoba abahleli bezinhlelo beqhubeka nokubhala ikhodi entsha futhi bengeza izichasiselo kukhodi ekhona. Abasebenzisi bethu bebesakulambele ukusebenza okwengeziwe, kodwa sijabule ukuhlangana nabo phakathi nendawo.

Sanquma ukubuyela komunye wemibono yangaphambili mayelana ne-mypy. Okungukuthi, ukuguqula ikhodi yePython ibe yikhodi C. Ukuhlola i-Cython (uhlelo olukuvumela ukuthi uhumushe ikhodi ebhalwe nge-Python uye kwikhodi engu-C) akuzange kusinikeze noma yikuphi ukusheshisa okubonakalayo, ngakho-ke sinqume ukuvuselela umqondo wokubhala umdidiyeli wethu. Njengoba i-mypy codebase (ebhalwe nge-Python) isivele iqukethe zonke izichasiselo zohlobo oludingekayo, sicabange ukuthi kungaba kuhle ukuzama ukusebenzisa lezi zichasiselo ukusheshisa uhlelo. Ngidale ngokushesha i-prototype ukuze ngihlole lo mbono. Ibonise ukwanda kokusebenza okuphindwe ka-10 kuma-micro-benchmarks ahlukahlukene. Umqondo wethu bekuwukuhlanganisa amamojula e-Python abe amamojula C sisebenzisa i-Cython, futhi siguqule izichasiselo zohlobo zibe ukuhlolwa kohlobo lwesikhathi sokusebenza (imvamisa ukuthayipha kwezichasiselo azinakwa ngesikhathi sokusebenza futhi kusetshenziswe kuphela amasistimu okuhlola uhlobo ). Empeleni sihlele ukuhumusha ukuqaliswa kwe-mypy kusuka ku-Python kuya olimini olwaklanyelwe ukuthayipha ngokwezibalo, ezobukeka (futhi, ingxenye enkulu, isebenze) njengePython ncamashi. (Lolu hlobo lokufuduka kolunye ulimi seluphenduke into yesiko lephrojekthi ye-mypy. Ukuqaliswa kwe-mypy yasekuqaleni kwabhalwa nge-Alore, kwase kuba khona ingxube ye-syntactic ye-Java ne-Python).

Ukugxila kusandiso se-CPython API bekuyisihluthulelo sokungalahlekelwa amandla okuphatha iphrojekthi. Besingadingi ukusebenzisa umshini obonakalayo nanoma yimiphi imitapo yolwazi eyayidingwa yi-mypy. Ngaphezu kwalokho, sisezokwazi ukufinyelela kuyo yonke i-ecosystem ye-Python nawo wonke amathuluzi (afana ne-pytest). Lokhu kusho ukuthi singaqhubeka nokusebenzisa ikhodi ye-Python ehunyushiwe phakathi nokuthuthukiswa, okusivumela ukuthi siqhubeke nokusebenza ngephethini esheshayo yokwenza izinguquko zekhodi nokuyihlola, kunokulinda ukuthi ikhodi ihlanganiswe. Kwakubonakala sengathi senza umsebenzi omuhle kakhulu wokuhlala ezihlalweni ezimbili, ngomqondo ongokomfanekiso, futhi sasikuthanda.

Umdidiyeli, esiwubize nge-mypyc (njengoba isebenzisa i-mypy njengesiphetho esingaphambili sokuhlaziya izinhlobo), kube yiphrojekthi ephumelele kakhulu. Sekukonke, sizuze cishe ukusheshisa okungu-4x kokugijima njalo kwe-mypy ngaphandle kwe-caching. Ukuthuthukisa umnyombo wephrojekthi ye-mypyc kwathatha iqembu elincane likaMichael Sullivan, u-Ivan Levkivsky, uHugh Hahn, kanye nami cishe izinyanga zekhalenda ze-4. Leli nani lomsebenzi belincane kakhulu kunalokho obekuzodingeka ukuze ubhale kabusha i-mypy, isibonelo, ku-C++ noma ku-Go. Futhi kwadingeka senze izinguquko ezimbalwa kakhulu kulo msebenzi kunalokho okwakuyodingeka sizenze lapho siwubhala kabusha ngolunye ulimi. Siphinde sathemba ukuthi singaletha i-mypyc ezingeni lokuthi abanye abahleli bezinhlelo zeDropbox bangayisebenzisa ukuhlanganisa nokusheshisa ikhodi yabo.

Ukuze sifinyelele leli zinga lokusebenza, bekufanele sisebenzise izixazululo ezithokozisayo zobunjiniyela. Ngakho-ke, umhlanganisi angasheshisa imisebenzi eminingi ngokusebenzisa ukwakhiwa kweleveli ephansi engu-C. Futhi ucingo olunjalo lushesha kakhulu kunokubiza umsebenzi ohunyushiwe. Eminye imisebenzi, efana nokubheka isichazamazwi, isabandakanyeka kusetshenziswa izingcingo ezijwayelekile ze-C-API ezivela ku-CPython, ebezishesha kancane uma zihlanganiswa. Sikwazile ukuqeda umthwalo owengeziwe ohlelweni oludalwe ngokuhumusha, kodwa lokhu kuleli cala kwanikeza inzuzo encane kuphela ngokusebenza.

Ukuhlonza imisebenzi β€œehamba kancane” evame kakhulu, senze iphrofayela yekhodi. Sihlome ngale datha, sizame ukuhlanganisa i-mypyc ukuze ikhiqize ikhodi ye-C esheshayo yemisebenzi enjalo, noma sibhale kabusha ikhodi ehambisanayo yePython sisebenzisa ukusebenza okusheshayo (futhi ngezinye izikhathi sasingenaso isisombululo esanele salokho noma enye inkinga) . Ukubhala kabusha ikhodi ye-Python ngokuvamile kwakuyisixazululo esilula enkingeni kunokuba umhlanganisi enze ngokuzenzakalelayo uguquko olufanayo. Ngokuhamba kwesikhathi, besifuna ukwenza okuningi kwalezi zinguquko, kodwa ngaleso sikhathi sasigxile ekusheshiseni i-mypy ngomzamo omncane. Futhi ekuqhubekeleni kulo mgomo, sinqamula amakhona amaningana.

Kuzoqhubeka ...

Bafundi abathandekayo! Wawuthini umbono wakho ngephrojekthi ye-mypy lapho ufunda ngobukhona bayo?

Indlela yokuhlola imigqa eyizigidi ezi-4 yekhodi yePython. Ingxenye 2
Indlela yokuhlola imigqa eyizigidi ezi-4 yekhodi yePython. Ingxenye 2

Source: www.habr.com

Engeza amazwana