Ọna lati ṣe ayẹwo awọn laini miliọnu mẹrin ti koodu Python. Apa 4

Loni a n ṣe atẹjade apakan keji ti itumọ ohun elo nipa bii Dropbox ṣe ṣeto iru iṣakoso fun ọpọlọpọ awọn laini miliọnu ti koodu Python.

Ọna lati ṣe ayẹwo awọn laini miliọnu mẹrin ti koodu Python. Apa 4

Ka apa kini

Atilẹyin iru osise (PEP 484)

A waiye wa akọkọ pataki adanwo pẹlu mypy ni Dropbox nigba gige Osu 2014. Gige Osu ti wa ni a ọkan-ọsẹ iṣẹlẹ ti gbalejo nipa Dropbox. Lakoko yii, awọn oṣiṣẹ le ṣiṣẹ lori ohunkohun ti wọn fẹ! Diẹ ninu awọn iṣẹ imọ-ẹrọ olokiki julọ ti Dropbox bẹrẹ ni awọn iṣẹlẹ bii iwọnyi. Bi abajade idanwo yii, a pari pe mypy dabi ẹni ti o ni ileri, botilẹjẹpe iṣẹ akanṣe ko ti ṣetan fun lilo ni ibigbogbo.

Ni akoko yẹn, imọran ti iwọntunwọnsi iru awọn ọna ṣiṣe itọsi iru Python wa ni afẹfẹ. Bi mo ti sọ, niwon Python 3.0 o ṣee ṣe lati lo iru awọn akọsilẹ fun awọn iṣẹ, ṣugbọn awọn wọnyi jẹ awọn ọrọ lainidii lainidii, laisi asọye sintasi ati itumọ. Lakoko ipaniyan eto, awọn asọye wọnyi, fun apakan pupọ julọ, ni aibikita lasan. Lẹhin Ọsẹ gige, a bẹrẹ ṣiṣẹ lori isọdiwọn atunmọ. Iṣẹ yii yori si ifarahan PEP 484 (Guido van Rossum, Łukasz Langa ati Emi ṣe ifowosowopo lori iwe yii).

Awọn idi wa ni a le wo lati ẹgbẹ meji. Ni akọkọ, a nireti pe gbogbo ilolupo eda abemi Python le gba ọna ti o wọpọ si lilo awọn itọka iru (ọrọ kan ti a lo ninu Python gẹgẹbi deede ti “awọn asọye iru”). Eyi, fun awọn ewu ti o ṣeeṣe, yoo dara julọ ju lilo ọpọlọpọ awọn isunmọ ti ko ni ibamu. Ẹlẹẹkeji, a fẹ lati jiroro ni gbangba awọn ọna ṣiṣe asọye iru pẹlu ọpọlọpọ awọn ọmọ ẹgbẹ ti agbegbe Python. Ifẹ yii jẹ apakan apakan nipasẹ otitọ pe a kii yoo fẹ lati dabi “awọn apẹhinda” lati awọn imọran ipilẹ ti ede ni oju awọn ọpọ eniyan gbooro ti awọn olupilẹṣẹ Python. O jẹ ede ti a tẹ ni agbara, ti a mọ si “titẹ pepeye”. Ni agbegbe, ni ibẹrẹ ibẹrẹ, ihuwasi ifura kan si imọran ti titẹ aimi ko le ṣe iranlọwọ ṣugbọn dide. Ṣugbọn imọlara yẹn bajẹ lẹhin ti o han gbangba pe titẹ aimi kii yoo jẹ dandan (ati lẹhin ti awọn eniyan rii pe o wulo gaan).

Iru sintasi itọka ti o gba nikẹhin jọra pupọ si ohun ti mypy ṣe atilẹyin ni akoko naa. PEP 484 ti tu silẹ pẹlu Python 3.5 ni ọdun 2015. Python kii ṣe ede ti a tẹ ni agbara mọ. Mo nifẹ lati ronu iṣẹlẹ yii bi iṣẹlẹ pataki kan ninu itan-akọọlẹ Python.

Bẹrẹ ti ijira

Ni ipari 2015, Dropbox ṣẹda ẹgbẹ kan ti eniyan mẹta lati ṣiṣẹ lori mypy. Wọn pẹlu Guido van Rossum, Greg Price ati David Fisher. Lati akoko yẹn, ipo naa bẹrẹ lati dagbasoke ni iyara pupọ. Idiwo akọkọ si idagbasoke mypy jẹ iṣẹ ṣiṣe. Gẹgẹbi Mo ti sọ loke, ni awọn ọjọ ibẹrẹ ti iṣẹ akanṣe naa Mo ronu nipa titumọ imuse mypy sinu C, ṣugbọn ero yii ti kọja kuro ni atokọ fun bayi. A duro pẹlu ṣiṣe eto naa nipa lilo onitumọ CPython, eyiti ko yara to fun awọn irinṣẹ bii mypy. (Ise agbese PyPy, imuse Python yiyan pẹlu akopọ JIT, ko ṣe iranlọwọ fun wa boya.)

O da, diẹ ninu awọn ilọsiwaju algorithmic ti wa si iranlọwọ wa nibi. “Imuyara” akọkọ ti o lagbara ni imuse ti iṣayẹwo afikun. Ero ti o wa lẹhin ilọsiwaju yii rọrun: ti gbogbo awọn igbẹkẹle module ko ba yipada lati igba ṣiṣe iṣaaju ti mypy, lẹhinna a le lo data ti a fipamọ lakoko ṣiṣe iṣaaju lakoko ṣiṣe pẹlu awọn igbẹkẹle. A nilo nikan lati ṣe ayẹwo iru lori awọn faili ti a yipada ati lori awọn faili ti o gbarale wọn. Mypy paapaa lọ siwaju diẹ: ti wiwo ita ti module ko ba yipada, mypy ro pe awọn modulu miiran ti o gbejade module yii ko nilo lati ṣayẹwo lẹẹkansi.

Ṣiṣayẹwo afikun ti ṣe iranlọwọ fun wa pupọ nigbati o ba n ṣalaye iye titobi ti koodu to wa tẹlẹ. Koko ọrọ ni pe ilana yii nigbagbogbo pẹlu ọpọlọpọ awọn ṣiṣe aṣetunṣe ti mypy bi awọn alaye ti wa ni afikun diẹdiẹ si koodu ati ni ilọsiwaju ni ilọsiwaju. Ṣiṣe akọkọ ti mypy tun jẹ o lọra pupọ nitori pe o ni ọpọlọpọ awọn igbẹkẹle lati ṣayẹwo. Lẹhinna, lati mu ipo naa dara, a ṣe imuse ẹrọ isakoṣo latọna jijin. Ti mypy ba rii pe kaṣe agbegbe le jẹ ti ọjọ, o ṣe igbasilẹ aworan kaṣe lọwọlọwọ fun gbogbo codebase lati ibi ipamọ aarin. Lẹhinna o ṣe ayẹwo afikun nipa lilo aworan aworan yii. Eyi ti mu wa ni igbesẹ nla kan si jijẹ iṣẹ ṣiṣe ti mypy.

Eyi jẹ akoko iyara ati isọdọmọ adayeba ti iru iṣayẹwo ni Dropbox. Ni ipari 2016, a ti ni isunmọ awọn laini 420000 ti koodu Python pẹlu iru awọn asọye. Ọpọlọpọ awọn olumulo ni itara nipa ṣiṣe ayẹwo iru. Awọn ẹgbẹ idagbasoke siwaju ati siwaju sii ni lilo Dropbox mypy.

Ohun gbogbo dara lẹhinna, ṣugbọn a tun ni ọpọlọpọ lati ṣe. A bẹrẹ lati ṣe awọn iwadii olumulo inu igbakọọkan lati ṣe idanimọ awọn agbegbe iṣoro ti iṣẹ akanṣe ati loye kini awọn ọran nilo lati yanju ni akọkọ (iwa yii tun lo ni ile-iṣẹ loni). Pataki julọ, bi o ti han gbangba, jẹ awọn iṣẹ-ṣiṣe meji. Ni akọkọ, a nilo agbegbe iru diẹ sii ti koodu, keji, a nilo mypy lati ṣiṣẹ ni iyara. O han gbangba pe iṣẹ wa lati yara mypy ati imuse rẹ sinu awọn iṣẹ akanṣe ile-iṣẹ ṣi jina lati pari. A, ni kikun mọ pataki ti awọn iṣẹ-ṣiṣe meji wọnyi, ṣeto nipa yiyan wọn.

Iṣelọpọ diẹ sii!

Awọn sọwedowo afikun jẹ ki mypy yiyara, ṣugbọn ọpa naa ko tun yara to. Ọpọlọpọ awọn sọwedowo afikun ṣiṣe ni bii iṣẹju kan. Idi fun eyi ni awọn agbewọle lati ilu okeere. Eyi kii yoo ṣe ohun iyanu fun ẹnikẹni ti o ti ṣiṣẹ pẹlu awọn koodu koodu nla ti a kọ sinu Python. A ni awọn akojọpọ ọgọọgọrun awọn modulu, ọkọọkan eyiti o ko gbogbo awọn miiran wọle laiṣe taarata. Ti faili eyikeyi ninu lupu agbewọle ti yipada, mypy ni lati ṣe ilana gbogbo awọn faili ti o wa ninu lupu yẹn, ati nigbagbogbo eyikeyi awọn modulu ti o gbe awọn modulu wọle lati lupu yẹn. Ọkan iru yiyi ni “tangle igbẹkẹle” olokiki ti o fa wahala pupọ ni Dropbox. Ni kete ti eto yii ni ọpọlọpọ awọn modulu ọgọọgọrun, lakoko ti o ti gbe wọle, taara tabi aiṣe-taara, ọpọlọpọ awọn idanwo, o tun lo ni koodu iṣelọpọ.

A ṣe akiyesi iṣeeṣe ti awọn igbẹkẹle ipin “tangling”, ṣugbọn a ko ni awọn orisun lati ṣe. Koodu pupọ wa ti a ko faramọ pẹlu. Bi abajade, a wa pẹlu ọna yiyan. A pinnu lati jẹ ki mypy ṣiṣẹ ni kiakia paapaa niwaju “awọn tangles igbẹkẹle”. A ṣe aṣeyọri ibi-afẹde yii nipa lilo mypy daemon. Daemon jẹ ilana olupin ti o ṣe awọn ẹya ti o nifẹ si meji. Ni akọkọ, o tọju alaye nipa gbogbo ipilẹ koodu ni iranti. Eyi tumọ si pe ni gbogbo igba ti o ba nṣiṣẹ mypy, o ko ni lati ṣaja data cache ti o ni ibatan si ẹgbẹẹgbẹrun awọn igbẹkẹle ti a ko wọle. Ni ẹẹkeji, o farabalẹ, ni ipele ti awọn ẹya igbekale kekere, ṣe itupalẹ awọn igbẹkẹle laarin awọn iṣẹ ati awọn nkan miiran. Fun apẹẹrẹ, ti iṣẹ naa ba foo Awọn ipe iṣẹ kan bar, lẹhinna igbẹkẹle wa foo lati bar. Nigbati faili ba yipada, daemon akọkọ, ni ipinya, ṣe ilana faili ti o yipada nikan. Lẹhinna o wo awọn ayipada ti o han ni ita si faili yẹn, gẹgẹbi awọn ibuwọlu iṣẹ ti o yipada. Daemon naa nlo alaye alaye nipa awọn agbewọle lati ilu okeere nikan lati ṣayẹwo lẹẹmeji awọn iṣẹ wọnyẹn ti o lo iṣẹ ti a ṣe atunṣe gaan. Ni deede, pẹlu ọna yii, o ni lati ṣayẹwo awọn iṣẹ diẹ pupọ.

Ṣiṣe gbogbo eyi ko rọrun, niwọn igba ti imuse mypy atilẹba ti ni idojukọ pupọ lori sisẹ faili kan ni akoko kan. A ni lati koju ọpọlọpọ awọn ipo aala, iṣẹlẹ ti o nilo awọn sọwedowo leralera ni awọn ọran nibiti nkan ti yipada ninu koodu naa. Fun apẹẹrẹ, eyi n ṣẹlẹ nigbati a ba yan kilasi kan kilasi ipilẹ tuntun. Ni kete ti a ṣe ohun ti a fẹ, a ni anfani lati dinku akoko ipaniyan ti ọpọlọpọ awọn sọwedowo afikun si iṣẹju diẹ. Eyi dabi iṣẹgun nla fun wa.

Ani diẹ sise!

Paapọ pẹlu caching latọna jijin ti Mo jiroro ni oke, mypy daemon fẹrẹ pari awọn iṣoro ti o dide nigbati olupilẹṣẹ nigbagbogbo n ṣiṣẹ iru iṣayẹwo, ṣiṣe awọn ayipada si nọmba kekere ti awọn faili. Bibẹẹkọ, iṣẹ ṣiṣe eto ni ọran lilo ọjo ti o kere ju tun jina si aipe. Ibẹrẹ mimọ ti mypy le gba to iṣẹju 15. Ati pe eyi jẹ diẹ sii ju a yoo ti ni idunnu pẹlu. Ni gbogbo ọsẹ ipo naa buru si bi awọn olupilẹṣẹ tẹsiwaju lati kọ koodu tuntun ati ṣafikun awọn alaye si koodu ti o wa tẹlẹ. Ebi tun npa awọn olumulo wa fun iṣẹ diẹ sii, ṣugbọn inu wa dun lati pade wọn ni agbedemeji.

A pinnu lati pada si ọkan ninu awọn imọran iṣaaju nipa mypy. Eyun, lati yi koodu Python pada si koodu C. Ṣiṣayẹwo pẹlu Cython (eto kan ti o fun ọ laaye lati tumọ koodu ti a kọ sinu Python sinu koodu C) ko fun wa ni iyara ti o han, nitorinaa a pinnu lati sọji imọran kikọ alakojọ tiwa. Niwọn igba ti koodu mypy (ti a kọ ni Python) ti ni gbogbo awọn asọye iru pataki ti o wa ninu tẹlẹ, a ro pe yoo tọ lati gbiyanju lati lo awọn asọye wọnyi lati mu eto naa pọ si. Mo yara ṣẹda apẹrẹ kan lati ṣe idanwo imọran yii. O ṣe afihan diẹ sii ju 10-agbo ilosoke ninu iṣẹ ṣiṣe lori ọpọlọpọ awọn aami-kekere. Ero wa ni lati ṣajọ awọn modulu Python si awọn modulu C nipa lilo Cython, ati lati yi iru awọn asọye sinu awọn sọwedowo iru akoko-ṣiṣe (nigbagbogbo tẹ awọn asọye ni aibikita ni akoko ṣiṣe ati lilo nikan nipasẹ awọn eto ṣiṣe ayẹwo iru). A gbero gangan lati tumọ imuse mypy lati Python sinu ede ti a ṣe apẹrẹ lati tẹ ni iṣiro, ti yoo dabi (ati, fun apakan pupọ julọ, iṣẹ) gangan bii Python. (Iru ijira ede-agbelebu yii ti di nkan ti aṣa ti iṣẹ akanṣe mypy. Ipilẹṣẹ mypy atilẹba ti kọ ni Alore, lẹhinna arabara syntactic ti Java ati Python wa).

Idojukọ lori API itẹsiwaju CPython jẹ bọtini lati ma padanu awọn agbara iṣakoso ise agbese. A ko nilo lati ṣe ẹrọ foju kan tabi awọn ile-ikawe eyikeyi ti mypy nilo. Ni afikun, a yoo tun ni iwọle si gbogbo ilolupo Python ati gbogbo awọn irinṣẹ (bii pytest). Eyi tumọ si pe a le tẹsiwaju lati lo koodu Python itumọ lakoko idagbasoke, gbigba wa laaye lati tẹsiwaju ṣiṣẹ pẹlu ilana ti o yara pupọ ti ṣiṣe awọn iyipada koodu ati idanwo rẹ, dipo iduro fun koodu lati ṣajọ. O dabi pe a ṣe iṣẹ nla ti joko lori awọn aga meji, bẹ sọ, ati pe a nifẹ rẹ.

Olupilẹṣẹ, eyiti a pe ni mypyc (niwọn bi o ti nlo mypy bi opin-iwaju fun awọn itupalẹ awọn oriṣi), ti jade lati jẹ iṣẹ akanṣe aṣeyọri pupọ. Lapapọ, a ṣaṣeyọri isunmọ iyara 4x fun awọn ṣiṣe mypy loorekoore laisi caching. Sise awọn mojuto ti awọn mypyc ise agbese mu kan kekere egbe ti Michael Sullivan, Ivan Levkivsky, Hugh Hahn, ati awọn ara mi nipa 4 kalẹnda osu. Iye iṣẹ yii kere pupọ ju ohun ti yoo nilo lati tunkọ mypy, fun apẹẹrẹ, ni C ++ tabi Lọ. A sì ní láti ṣe àwọn ìyípadà díẹ̀ sí iṣẹ́ náà ju bí a ti ní láti ṣe nígbà tí a bá ń tún un kọ ní èdè mìíràn. A tun nireti pe a le mu mypyc wa si iru ipele ti awọn olutọpa Dropbox miiran le lo lati ṣajọ ati yiyara koodu wọn.

Lati ṣaṣeyọri ipele iṣẹ ṣiṣe, a ni lati lo diẹ ninu awọn solusan imọ-ẹrọ ti o nifẹ. Nitorinaa, olupilẹṣẹ le mu awọn iṣẹ lọpọlọpọ pọ si nipa lilo iyara, awọn igbelewọn ipele kekere Fun apẹẹrẹ, ipe iṣẹ ti o ṣajọ ti tumọ si ipe iṣẹ C kan. Ati pe iru ipe kan yiyara pupọ ju pipe iṣẹ itumọ lọ. Diẹ ninu awọn iṣẹ ṣiṣe, gẹgẹbi awọn wiwa iwe-itumọ, tun kan pẹlu lilo awọn ipe C-API deede lati CPython, eyiti o yara diẹ diẹ nigbati o ba ṣajọ. A ni anfani lati yọkuro fifuye afikun lori eto ti a ṣẹda nipasẹ itumọ, ṣugbọn eyi fun ere kekere nikan ni awọn iṣe iṣe.

Lati ṣe idanimọ awọn iṣẹ “lọra” ti o wọpọ julọ, a ṣe profaili koodu. Ni ihamọra pẹlu data yii, a gbiyanju lati boya tweak mypyc ki o le ṣe agbekalẹ koodu C yiyara fun iru awọn iṣẹ bẹ, tabi tunkọ koodu Python ti o baamu nipa lilo awọn iṣẹ yiyara (ati nigbakan a ko ni irọrun to rọrun fun iyẹn tabi iṣoro miiran) . Atunkọ koodu Python nigbagbogbo jẹ ojutu ti o rọrun si iṣoro naa ju nini alakojọ ṣe iyipada kanna laifọwọyi. Ni igba pipẹ, a fẹ lati ṣe adaṣe ọpọlọpọ awọn iyipada wọnyi, ṣugbọn ni akoko ti a dojukọ lori iyara mypy pẹlu ipa diẹ. Ati ni gbigbe si ibi-afẹde yii, a ge awọn igun pupọ.

A tun ma a se ni ojo iwaju…

Eyin onkawe! Kini awọn iwunilori rẹ ti iṣẹ akanṣe mypy nigbati o kọ ẹkọ nipa wiwa rẹ?

Ọna lati ṣe ayẹwo awọn laini miliọnu mẹrin ti koodu Python. Apa 4
Ọna lati ṣe ayẹwo awọn laini miliọnu mẹrin ti koodu Python. Apa 4

orisun: www.habr.com

Fi ọrọìwòye kun