Rydym yn cyflwyno i chi drydydd rhan cyfieithiad o ddeunydd am y llwybr a gymerodd Dropbox wrth weithredu system wirio math ar gyfer cod Python.
→ Rhannau blaenorol: и
Cyrraedd 4 miliwn o linellau o god wedi'i deipio
Her bwysig arall (yr ail bryder mwyaf poblogaidd ymhlith y rhai a gymerodd ran mewn arolygon mewnol) oedd cynyddu faint o god wedi'i wirio am fath yn Dropbox. Fe wnaethon ni roi cynnig ar sawl dull i fynd i'r afael â hyn, o ganiatáu i'r gronfa god wedi'i theipio dyfu'n organig i ganolbwyntio'r tîm mypy ar gasgliad math awtomataidd statig a deinamig. Yn y pen draw, roedd yn ymddangos nad oedd un strategaeth fuddugol, ond roedden ni'n gallu cyflawni twf cyflym yn faint o god wedi'i anodi trwy gyfuno dulliau lluosog.
O ganlyniad, mae ein storfa Python fwyaf (gyda chod cefndirol) wedi cyrraedd bron i 4 miliwn o linellau o god wedi'i anodi. Cymerodd y gwaith ar deipio'r cod yn statig tua thair blynedd. Mae Mypy bellach yn cefnogi gwahanol fathau o adroddiadau cwmpas math, sy'n ei gwneud hi'n haws monitro cynnydd teipio. Yn benodol, gallwn gynhyrchu adroddiadau ar god gydag amwysedd math, fel defnydd math penodol. Any mewn anodiadau na ellir eu gwirio, neu gyda phroblemau fel mewnforio llyfrgelloedd trydydd parti sydd heb anodiadau math. Fel rhan o Brosiect Cywirdeb Gwirio Math Dropbox, rydym wedi cyfrannu at wella'r diffiniadau math (y rhai a elwir yn ffeiliau stub) ar gyfer rhai llyfrgelloedd ffynhonnell agored poblogaidd yn ystorfa Python ganolog. .
Fe wnaethon ni weithredu (a safoni mewn PEPs dilynol) nodweddion system deipio newydd 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 gyda 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 cefnogaeth ar gyfer galluoedd rhifiadol Python.

Nifer o linellau o god wedi'i anodi: gweinydd

Nifer o linellau o god wedi'i anodi: cleient

Cyfanswm nifer y llinellau o god wedi'i anodi
Dyma drosolwg o'r camau allweddol a gymerwyd gennym i gynyddu faint o god wedi'i anodi yn Dropbox:
Llymder Anodiadau. Rydym wedi cynyddu'r gofynion llymder anodiadau ar gyfer cod newydd yn raddol. Dechreuon ni gydag awgrymiadau linter a awgrymodd ychwanegu anodiadau at ffeiliau a oedd eisoes â rhai anodiadau. Nawr, rydym yn gofyn am anodiadau teip mewn ffeiliau Python newydd ac yn y rhan fwyaf o ffeiliau sy'n bodoli eisoes.
Adroddiadau teipio. Rydym yn anfon adroddiadau wythnosol at dimau ar lefel teipio eu cod ac yn rhoi cyngor ar beth i'w anodi yn gyntaf.
Hyrwyddo mypy. Rydym yn siarad am mypy mewn amrywiol ddigwyddiadau ac yn ymgysylltu â thimau i'w helpu i ddechrau defnyddio anodiadau teip.
Arolygon. Rydym yn cynnal arolygon defnyddwyr cyfnodol i nodi materion allweddol. Rydym yn barod i fynd i drafferth fawr i fynd i'r afael â'r pryderon hyn (hyd yn oed creu iaith newydd i gyflymu mypy!).
Perfformiad. Rydym wedi gwella perfformiad mypy yn sylweddol trwy ddefnyddio daemon a mypyc. Gwnaed hyn i liniaru'r anghyfleustra sy'n codi yn ystod y broses anodi ac i ganiatáu gweithio gyda chyfrolau mwy o god.
Integreiddio golygyddion. Rydym wedi creu offer i gefnogi rhedeg mypy mewn golygyddion poblogaidd yn Dropbox, gan gynnwys PyCharm, Vim, a VS Code. Mae hyn yn symleiddio'r broses o anodi cod a gwirio ei ymarferoldeb yn sylweddol. Defnyddir y camau gweithredu hyn fel arfer wrth anodi cod presennol.
Dadansoddiad statig. Fe wnaethon ni greu offeryn ar gyfer casglu llofnodion ffwythiannau gan ddefnyddio offer dadansoddi statig. Dim ond mewn sefyllfaoedd cymharol syml y gall yr offeryn hwn weithio, ond fe helpodd ni i gynyddu cwmpas math cod gyda'r ymdrech leiaf.
Cymorth llyfrgell trydydd parti. Mae llawer o'n prosiectau'n defnyddio pecyn cymorth SQLAlchemy. Mae'n defnyddio galluoedd deinamig Python, na all mathau PEP 484 eu modelu'n uniongyrchol. Yn unol â PEP 561, fe wnaethom greu ffeil stub gyfatebol ac ysgrifennu ategyn ar gyfer mypy (), sy'n gwella cefnogaeth SQLAlchemy.
Yr anawsterau a wynebwyd gennym
Nid oedd y daith i 4 miliwn o linellau o god wedi'i deipio bob amser yn hawdd. Fe wnaethon ni ddod ar draws llawer o rwystrau a gwneud ychydig o gamgymeriadau ar hyd y ffordd. Dyma rai o'r problemau a ddaethom ar eu traws. Gobeithiwn y bydd rhannu'r straeon hyn yn helpu eraill i osgoi problemau tebyg.
Ffeiliau wedi'u hepgor. Dechreuon ni drwy wirio nifer fach o ffeiliau yn unig. Ni wiriwyd unrhyw beth y tu allan i'r ffeiliau hyn. Ychwanegwyd ffeiliau at y rhestr wirio pan ymddangosodd yr anodiadau cyntaf ynddynt. Os mewnforiwyd rhywbeth o fodiwl a oedd wedi'i leoli y tu allan i gwmpas y gwiriad, roedd yn golygu gweithio gyda gwerthoedd fel Any, na chawsant eu gwirio o gwbl. Arweiniodd hyn at golled sylweddol o ran cywirdeb math, yn enwedig yng nghyfnodau cynnar y mudo. Roedd y dull hwn wedi gweithio'n syndod o dda hyd yn hyn, er ei bod yn gyffredin i ychwanegu ffeiliau at y gwiriwr math ddatgelu problemau mewn rhannau eraill o'r gronfa god. Yn yr achos gwaethaf, wrth uno dau faes cod ynysig a oedd eisoes wedi'u gwirio math yn annibynnol, roedd y mathau yn yr ardaloedd hyn yn anghydnaws. Roedd hyn yn gofyn am nifer o newidiadau i'r anodiadau. Wrth edrych yn ôl, rydym yn sylweddoli y dylem fod wedi ychwanegu'r modiwlau llyfrgell craidd at y gwiriwr math mypy cyn gynted â phosibl. Byddai hyn wedi gwneud ein llif gwaith yn llawer mwy rhagweladwy.
Anodi Cod Etifeddiaeth. Pan ddechreuon ni, roedd gennym ni tua 4 miliwn o linellau o god Python presennol. Roedd yn amlwg y byddai anodi'r holl god hwn yn dasg anodd. Fe wnaethon ni greu offeryn o'r enw PyAnnotate, a all gasglu gwybodaeth am fath yn ystod gweithrediad prawf ac ychwanegu anodiadau math at y cod yn seiliedig ar y wybodaeth a gasglwyd. Fodd bynnag, ni welsom fabwysiad eang o'r offeryn hwn. Roedd casglu gwybodaeth am fath yn araf, ac yn aml roedd angen golygu llaw helaeth ar yr anodiadau a gynhyrchwyd yn awtomatig. Fe wnaethon ni ystyried rhedeg yr offeryn hwn yn awtomatig yn ystod pob adolygiad cod neu gasglu gwybodaeth am fath yn seiliedig ar sampl fach o geisiadau rhwydwaith go iawn, ond penderfynon ni yn ei erbyn, gan fod y naill ddull neu'r llall yn rhy beryglus.
Yn y pen draw, gallwn weld bod y rhan fwyaf o'r cod wedi'i anodi â llaw gan ei berchnogion. I arwain y broses hon, rydym yn paratoi adroddiadau ar fodiwlau a swyddogaethau pwysig iawn sydd angen eu hanodi. Er enghraifft, mae'n bwysig anodi modiwl llyfrgell a ddefnyddir mewn cannoedd o leoedd. Fodd bynnag, mae anodi gwasanaeth hen sy'n cael ei ddisodli gan un newydd yn llai pwysig. Rydym hefyd yn arbrofi gyda defnyddio dadansoddiad statig i gynhyrchu anodiadau math ar gyfer cod etifeddol.
Mewnforion Cylchol. Soniais am fewnforion cylchol (neu "ddrysfeydd dibyniaeth") uchod, a'u bodolaeth oedd yn gwneud mypy yn anodd ei gyflymu. Roedd yn rhaid i ni hefyd weithio'n galed i sicrhau bod mypy yn cefnogi'r holl idiomau a achoswyd gan y mewnforion cylchol hyn. Yn ddiweddar, cwblhawyd ailgynllunio system fawr a drwsiodd y rhan fwyaf o broblemau mypy gyda mewnforion cylchol. Mae'r problemau hyn mewn gwirionedd yn dyddio'n ôl i ddyddiau cynnar iawn y prosiect, i Alore, yr iaith addysgol y cynlluniwyd mypy ar ei chyfer yn wreiddiol. Mae cystrawen Alore yn ei gwneud hi'n hawdd trin mewnforion cylchol. Mae mypy modern yn etifeddu rhai cyfyngiadau o'i weithrediad cynharach, symlach (a oedd yn berffaith addas ar gyfer Alore). Mae Python yn cymhlethu mewnforion cylchol yn bennaf oherwydd amwysedd mynegiant. Er enghraifft, gallai aseiniad ddiffinio alias math mewn gwirionedd. Nid yw Mypy bob amser yn gallu canfod problemau o'r fath nes bod llawer o'r cylch mewnforio wedi'i brosesu. Nid oedd gan Alore unrhyw amwysedd o'r fath. Gall penderfyniadau gwael a wneir yn gynnar yn natblygiad y system adael y rhaglennwr gyda syndod annymunol flynyddoedd yn ddiweddarach.
Canlyniadau: Y Llwybr i 5 Miliwn o Linellau o God a Gorwelion Newydd
Mae prosiect mypy wedi dod yn bell—o brototeipiau cynnar i system sy'n rheoli mathau 4 miliwn o linellau o god cynhyrchu. Ar hyd y ffordd, mae mypy wedi safoni awgrymiadau teip yn Python. Heddiw, mae ecosystem gadarn wedi datblygu o amgylch teipio Python. Mae'n cynnwys cefnogaeth llyfrgell, cefnogaeth IDE a golygydd, a sawl system gwirio teip, pob un â'i fanteision a'i anfanteision ei hun.
Er bod gwirio teipiau eisoes yn cael ei gymryd yn ganiataol yn Dropbox, rwy'n hyderus ein bod ni'n dal i fod yn nyddiau cynnar teipio Python. Rwy'n credu y bydd technolegau gwirio teipiau yn parhau i esblygu a gwella.
Os nad ydych chi wedi defnyddio gwirio teipiau yn eich prosiect Python ar raddfa fawr eto, nawr yw'r amser perffaith i ddechrau newid i deipio statig. Rydw i wedi siarad â phobl sydd wedi newid, ac nid oes yr un ohonyn nhw wedi difaru. Mae gwirio teipiau yn gwneud Python yn iaith llawer gwell ar gyfer datblygu prosiectau ar raddfa fawr na "Python rheolaidd".
Annwyl ddarllenwyr! Ydych chi'n defnyddio gwirio math yn eich prosiectau Python?
Ffynhonnell: hab.com
