Y llwybr i deipio 4 miliwn o linellau o god Python. Rhan 3

Rydym yn cyflwyno i'ch sylw drydedd ran y cyfieithiad o ddeunydd am y llwybr a gymerodd Dropbox wrth weithredu system gwirio math ar gyfer cod Python.

Y llwybr i deipio 4 miliwn o linellau o god Python. Rhan 3

→ Rhannau blaenorol: yn gyntaf и ail

Cyrraedd 4 miliwn o linellau o god wedi'i deipio

Her fawr arall (a'r ail bryder mwyaf cyffredin ymhlith y rhai a arolygwyd yn fewnol) oedd cynyddu faint o god a gwmpesir gan wiriadau math yn Dropbox. Rydym wedi rhoi cynnig ar sawl dull o ddatrys y broblem hon, o dyfu'n naturiol maint y sylfaen god wedi'i theipio i ganolbwyntio ymdrechion y tîm mypy ar gasgliad math awtomataidd statig a deinamig. Yn y diwedd, roedd yn ymddangos nad oedd strategaeth fuddugol syml, ond roeddem yn gallu sicrhau twf cyflym yn nifer y cod anodedig trwy gyfuno llawer o ddulliau.

O ganlyniad, mae gan ein storfa Python fwyaf (gyda chod backend) bron i 4 miliwn o linellau o god anodedig. Cwblhawyd y gwaith ar deipio cod statig mewn tua thair blynedd. Mae Mypy bellach yn cefnogi gwahanol fathau o adroddiadau sylw cod sy'n ei gwneud hi'n haws monitro cynnydd teipio. Yn benodol, gallwn gynhyrchu adroddiadau ar god gydag amwysedd mewn mathau, megis, er enghraifft, defnydd penodol o fath Any mewn anodiadau na ellir eu gwirio, neu gyda phethau fel mewnforio llyfrgelloedd trydydd parti nad oes ganddynt anodiadau teip. Fel rhan o brosiect i wella cywirdeb gwirio math yn Dropbox, fe wnaethom gyfrannu at wella'r diffiniadau math (ffeiliau bonyn fel y'u gelwir) ar gyfer rhai llyfrgelloedd ffynhonnell agored poblogaidd mewn ystorfa Python ganolog teipio.

Fe wnaethom weithredu (a safoni mewn PEPs dilynol) nodweddion newydd o'r system fath sy'n caniatáu mathau mwy manwl gywir ar gyfer rhai patrymau Python penodol. Enghraifft nodedig o hyn yw TypeDict, sy'n darparu mathau ar gyfer geiriaduron tebyg i JSON sydd â set sefydlog o allweddi llinynnol, pob un â gwerth o'i fath ei hun. Byddwn yn parhau i ehangu'r system fath. Mae'n debyg mai ein cam nesaf fydd gwella'r gefnogaeth i alluoedd rhifiadol Python.

Y llwybr i deipio 4 miliwn o linellau o god Python. Rhan 3
Nifer llinellau cod anodedig: gweinydd

Y llwybr i deipio 4 miliwn o linellau o god Python. Rhan 3
Nifer llinellau cod anodedig: cleient

Y llwybr i deipio 4 miliwn o linellau o god Python. Rhan 3
Cyfanswm nifer y llinellau o god anodedig

Dyma drosolwg o brif nodweddion y pethau a wnaethom i gynyddu faint o god anodedig yn Dropbox:

Trylwyredd anodi. Yn raddol fe wnaethom gynyddu'r gofynion ar gyfer trylwyredd anodi cod newydd. Dechreuon ni gydag awgrymiadau linter a oedd yn awgrymu ychwanegu anodiadau at ffeiliau a oedd eisoes â rhai anodiadau. Mae angen anodiadau teip arnom nawr mewn ffeiliau Python newydd ac yn y rhan fwyaf o'r ffeiliau presennol.

Teipio adroddiadau. Rydym yn anfon adroddiadau wythnosol i dimau ar lefel y teipio yn eu cod ac yn rhoi cyngor ar yr hyn y dylid ei anodi yn gyntaf.

Poblogeiddio mypy. Rydyn ni'n siarad am mypy mewn digwyddiadau ac yn siarad â thimau i'w helpu i ddechrau gydag anodiadau teip.

Etholiadau. Rydym yn cynnal arolygon defnyddwyr cyfnodol i nodi problemau mawr. Rydym yn barod i fynd yn eithaf pell wrth ddatrys y problemau hyn (hyd yn oed creu iaith newydd i gyflymu mypy!).

Perfformiad. Rydym wedi gwella perfformiad mypy yn fawr trwy ddefnyddio'r daemon a'r mypyc. Gwnaethpwyd hyn i lyfnhau'r anghyfleustra sy'n codi yn ystod y broses anodi, ac er mwyn gallu gweithio gyda llawer iawn o god.

Integreiddio gyda golygyddion. Rydym wedi adeiladu offer i gefnogi rhedeg mypy mewn golygyddion sy'n boblogaidd ar Dropbox. Mae hyn yn cynnwys PyCharm, Vim a VS Code. Fe wnaeth hyn symleiddio'n fawr y broses o anodi'r cod a gwirio ei ymarferoldeb. Mae'r mathau hyn o gamau gweithredu yn gyffredin wrth anodi cod presennol.

Dadansoddiad statig. Fe wnaethon ni greu offeryn i gasglu llofnodion swyddogaeth gan ddefnyddio offer dadansoddi statig. Dim ond mewn sefyllfaoedd cymharol syml y gall yr offeryn hwn weithio, ond fe helpodd ni i gynyddu ein cwmpas math o god heb lawer o ymdrech.

Cefnogaeth i lyfrgelloedd trydydd parti. Mae llawer o'n prosiectau'n defnyddio pecyn cymorth SQLAlchemy. Mae'n manteisio ar alluoedd deinamig Python nad yw mathau PEP 484 yn gallu eu modelu'n uniongyrchol. Fe wnaethom ni, yn unol â PEP 561, greu'r ffeil bonyn gyfatebol ac ysgrifennu ategyn ar gyfer mypy (ffynhonnell agor), sy'n gwella cefnogaeth SQLAlchemy.

Anawsterau y daethom ar eu traws

Nid yw'r llwybr i 4 miliwn o linellau o god wedi'i deipio bob amser wedi bod yn hawdd i ni. Ar y llwybr hwn daethom ar draws llawer o dyllau yn y ffordd a gwnaethom sawl camgymeriad. Dyma rai o’r problemau y daethom ar eu traws. Gobeithiwn y bydd dweud amdanynt yn helpu eraill i osgoi problemau tebyg.

Ffeiliau ar goll. Dechreuon ni ein gwaith trwy wirio ychydig bach o ffeiliau yn unig. Ni wiriwyd unrhyw beth nad oedd wedi'i gynnwys yn y ffeiliau hyn. Ychwanegwyd ffeiliau at y rhestr sganio pan ymddangosodd yr anodiadau cyntaf ynddynt. Pe bai rhywbeth yn cael ei fewnforio o fodiwl sydd wedi'i leoli y tu allan i gwmpas y dilysu, yna roeddem yn siarad am weithio gyda gwerthoedd fel Any, na chawsant eu profi o gwbl. Arweiniodd hyn at golled sylweddol o ran cywirdeb teipio, yn enwedig yng nghamau cynnar mudo. Mae'r dull hwn wedi gweithio'n rhyfeddol o dda hyd yn hyn, er mai sefyllfa nodweddiadol yw bod ychwanegu ffeiliau at gwmpas yr adolygiad yn datgelu problemau mewn rhannau eraill o'r sylfaen cod. Yn yr achos gwaethaf, pan unwyd dau faes cod ynysig, lle, yn annibynnol ar ei gilydd, roedd mathau eisoes wedi'u gwirio, daeth i'r amlwg bod y mathau o'r meysydd hyn yn anghydnaws â'i gilydd. Arweiniodd hyn at yr angen i wneud llawer o newidiadau i'r anodiadau. Wrth edrych yn ôl nawr, rydym yn sylweddoli y dylem fod wedi ychwanegu modiwlau llyfrgell craidd i faes gwirio math mypy yn gynt. Byddai hyn yn gwneud ein gwaith yn llawer mwy rhagweladwy.

Yn anodi hen god. Pan ddechreuon ni, roedd gennym ni tua 4 miliwn o linellau o god Python presennol. Roedd yn amlwg nad oedd anodi’r holl god hwn yn dasg hawdd. Rydym wedi creu teclyn o'r enw PyAnnotate sy'n gallu casglu gwybodaeth teip wrth i brofion redeg ac sy'n gallu ychwanegu anodiadau teip i'ch cod yn seiliedig ar y wybodaeth a gasglwyd. Fodd bynnag, nid ydym wedi sylwi ar fabwysiadu'r offeryn hwn yn arbennig o eang. Roedd y broses o gasglu gwybodaeth teip yn araf, ac yn aml roedd angen llawer o olygiadau llaw ar gyfer anodiadau a gynhyrchir yn awtomatig. Fe wnaethom feddwl am redeg yr offeryn hwn yn awtomatig bob tro y byddwn yn adolygu cod, neu gasglu gwybodaeth fath yn seiliedig ar ddadansoddi rhai nifer fach o geisiadau rhwydwaith gwirioneddol, ond penderfynwyd peidio â gwneud hynny oherwydd bod y naill ddull neu'r llall yn ormod o risg.

O ganlyniad, gellir nodi bod y rhan fwyaf o'r cod wedi'i anodi â llaw gan ei berchnogion. Er mwyn arwain y broses hon i'r cyfeiriad cywir, rydym yn paratoi adroddiadau ar fodiwlau a swyddogaethau arbennig o bwysig y mae angen eu hanodi. Er enghraifft, mae'n bwysig darparu anodiadau teip ar gyfer modiwl llyfrgell a ddefnyddir mewn cannoedd o leoedd. Ond nid yw hen wasanaeth sy'n cael ei ddisodli ag un newydd bellach mor bwysig i'w anodi. Rydym hefyd yn arbrofi gyda defnyddio dadansoddiad statig i gynhyrchu anodiadau teip ar gyfer hen god.

Mewnforion cylchol. Uchod, siaradais am fewnforion cylchol (y “tangles dibyniaeth”), yr oedd bodolaeth y rhain yn ei gwneud yn anodd cyflymu mypy. Roedd yn rhaid i ni hefyd weithio'n galed i wneud i mypy gefnogi pob math o idiomau sy'n cael eu hachosi gan y mewnforion cylchol hyn. Yn ddiweddar, cwblhawyd prosiect ailgynllunio system mawr a ddatrysodd y rhan fwyaf o faterion mypy yn ymwneud â mewnforion cylchol. Deilliodd y problemau hyn mewn gwirionedd o ddyddiau cynnar iawn y prosiect, yn ôl o Alore, yr iaith addysgol y canolbwyntiodd y prosiect mypy arni yn wreiddiol. Mae cystrawen Alore yn ei gwneud hi'n hawdd datrys problemau gyda gorchmynion mewnforio cylchol. Mae mypy modern wedi etifeddu rhai cyfyngiadau o'i weithrediad cynharach, syml ei feddwl (a oedd yn ffit wych i Alore). Mae Python yn ei gwneud hi'n anodd gweithio gyda mewnforion cylchol, yn bennaf oherwydd bod ymadroddion yn amwys. Er enghraifft, gall gweithrediad aseiniad ddiffinio alias math mewn gwirionedd. Nid yw Mypy bob amser yn gallu canfod pethau fel hyn nes bod y rhan fwyaf o'r ddolen fewnforio wedi'i phrosesu. Nid oedd unrhyw amwysedd o'r fath yn Alore. Gall penderfyniadau gwael a wneir yn ystod camau cynnar datblygiad y system beri syndod annymunol i'r rhaglennydd flynyddoedd yn ddiweddarach.

Canlyniadau: y llwybr i 5 miliwn o linellau cod a gorwelion newydd

Mae'r prosiect mypy wedi dod yn bell - o brototeipiau cynnar i system sy'n rheoli 4 miliwn o linellau o fathau o god cynhyrchu. Wrth i mypy esblygu, safonwyd awgrymiadau teip Python. Y dyddiau hyn, mae ecosystem bwerus wedi datblygu o amgylch teipio cod Python. Mae ganddo le ar gyfer cefnogaeth llyfrgell, mae'n cynnwys offer ategol ar gyfer DRhA a golygyddion, mae ganddo sawl system rheoli math, ac mae gan bob un ohonynt ei fanteision a'i anfanteision ei hun.

Er bod gwirio math eisoes yn cael ei roi yn Dropbox, credaf ein bod yn dal i fod yn nyddiau cynnar teipio cod Python. Rwy'n credu y bydd technolegau gwirio teip yn parhau i esblygu a gwella.

Os nad ydych eisoes wedi defnyddio gwirio teip yn eich prosiect Python ar raddfa fawr, yna gwyddoch ei fod yn amser da iawn i ddechrau symud i deipio statig. Rwyf wedi siarad â’r rhai sydd wedi gwneud cyfnod pontio tebyg. Nid oedd yr un ohonynt yn difaru. Mae gwirio teip yn gwneud Python yn iaith sy'n llawer mwy addas ar gyfer datblygu prosiectau mawr na "Python rheolaidd."

Annwyl ddarllenwyr! Ydych chi'n defnyddio gwirio teip yn eich prosiectau Python?

Y llwybr i deipio 4 miliwn o linellau o god Python. Rhan 3
Y llwybr i deipio 4 miliwn o linellau o god Python. Rhan 3

Ffynhonnell: hab.com

Ychwanegu sylw