Njia ya kuangalia mistari milioni 4 ya nambari ya Python. Sehemu 3

Tunawasilisha kwa usikivu wako sehemu ya tatu ya tafsiri ya nyenzo kuhusu njia ambayo Dropbox ilichukua wakati wa kutekeleza mfumo wa kuangalia aina kwa msimbo wa Python.

Njia ya kuangalia mistari milioni 4 ya nambari ya Python. Sehemu 3

β†’ Sehemu za awali: kwanza ΠΈ pili

Inafikia laini milioni 4 za nambari iliyochapwa

Changamoto nyingine kubwa (na jambo la pili la kawaida kati ya wale waliohojiwa ndani) lilikuwa ni kuongeza idadi ya msimbo unaofunikwa na ukaguzi wa aina kwenye Dropbox. Tumejaribu mbinu kadhaa za kutatua tatizo hili, kutoka kwa kukuza kiasili ukubwa wa codebase iliyochapwa hadi kulenga juhudi za timu ya mypy kwenye uelekezaji tuli na thabiti wa aina ya kiotomatiki. Mwishowe, ilionekana kana kwamba hakukuwa na mkakati rahisi wa kushinda, lakini tuliweza kufikia ukuaji wa haraka wa kiasi cha msimbo uliofafanuliwa kwa kuchanganya mbinu nyingi.

Kama matokeo, hazina yetu kubwa zaidi ya Python (iliyo na nambari ya nyuma) ina karibu mistari milioni 4 ya msimbo uliofafanuliwa. Kazi ya kuandika msimbo tuli ilikamilika kwa takriban miaka mitatu. Mypy sasa inasaidia aina mbalimbali za ripoti za chanjo ya msimbo ambayo hurahisisha kufuatilia maendeleo ya uchapaji. Hasa, tunaweza kutoa ripoti kuhusu msimbo na utata katika aina, kama vile, kwa mfano, matumizi ya wazi ya aina. Any katika vidokezo ambavyo haviwezi kuthibitishwa, au kwa vitu kama vile kuleta maktaba za watu wengine ambazo hazina maelezo ya aina. Kama sehemu ya mradi wa kuboresha usahihi wa kukagua aina katika Dropbox, tulichangia kuboresha ufafanuzi wa aina (kinachojulikana kama faili za stub) kwa maktaba zingine maarufu za chanzo wazi katika hazina kuu ya Python. chapa.

Tulitekeleza (na kusawazisha katika PEP zilizofuata) vipengele vipya vya mfumo wa aina ambavyo vinaruhusu aina sahihi zaidi kwa mifumo fulani mahususi ya Chatu. Mfano mashuhuri wa hii ni TypeDict, ambayo hutoa aina za kamusi zinazofanana na JSON ambazo zina seti isiyobadilika ya vitufe vya kamba, kila moja ikiwa na thamani ya aina yake. Tutaendelea kupanua mfumo wa aina. Hatua yetu inayofuata itakuwa ni kuboresha usaidizi wa uwezo wa nambari wa Python.

Njia ya kuangalia mistari milioni 4 ya nambari ya Python. Sehemu 3
Idadi ya mistari ya msimbo uliofafanuliwa: seva

Njia ya kuangalia mistari milioni 4 ya nambari ya Python. Sehemu 3
Idadi ya mistari ya msimbo uliofafanuliwa: mteja

Njia ya kuangalia mistari milioni 4 ya nambari ya Python. Sehemu 3
Jumla ya idadi ya mistari ya msimbo uliofafanuliwa

Hapa kuna muhtasari wa huduma kuu za vitu tulivyofanya ili kuongeza idadi ya nambari iliyofafanuliwa kwenye Dropbox:

Ukali wa ufafanuzi. Tuliongeza hatua kwa hatua mahitaji ya ukali wa kubainisha nambari mpya. Tulianza na vidokezo vya linter ambavyo vilipendekeza kuongeza vidokezo kwenye faili ambazo tayari zilikuwa na vidokezo. Sasa tunahitaji maelezo ya aina katika faili mpya za Python na katika faili nyingi zilizopo.

Kuandika ripoti. Tunatuma timu ripoti za kila wiki kuhusu kiwango cha kuandika msimbo wao na kutoa ushauri kuhusu kile kinachofaa kubainishwa kwanza.

Umaarufu wa mypy. Tunazungumza kuhusu mypy kwenye hafla na tunazungumza na timu ili kuzisaidia kuanza na maelezo ya aina.

Kura. Tunafanya tafiti za mara kwa mara za watumiaji ili kubaini matatizo makubwa. Tuko tayari kwenda mbali kabisa katika kutatua shida hizi (hata kuunda lugha mpya ili kuharakisha mypy!).

Utendaji. Tumeboresha sana utendakazi wa mypy kwa kutumia daemon na mypyc. Hii ilifanyika ili kulainisha usumbufu unaojitokeza wakati wa mchakato wa ufafanuzi, na ili kuweza kufanya kazi kwa idadi kubwa ya nambari.

Kuunganishwa na wahariri. Tumeunda zana za kusaidia kuendesha mypy katika vihariri ambavyo ni maarufu kwenye Dropbox. Hii ni pamoja na PyCharm, Vim na VS Code. Hii imerahisisha sana mchakato wa kubainisha msimbo na kuangalia utendakazi wake. Aina hizi za vitendo ni za kawaida wakati wa kubainisha msimbo uliopo.

Uchambuzi tuli. Tumeunda zana ya kukadiria saini za utendakazi kwa kutumia zana za uchanganuzi tuli. Zana hii inaweza tu kufanya kazi katika hali rahisi, lakini ilitusaidia kuongeza chanjo ya aina ya msimbo bila juhudi nyingi.

Usaidizi kwa maktaba za watu wengine. Miradi yetu mingi hutumia zana za zana za SQLAlchemy. Inachukua fursa ya uwezo wa nguvu wa Python ambao aina za PEP 484 haziwezi kuiga moja kwa moja. Sisi, kwa mujibu wa PEP 561, tuliunda faili inayolingana ya stub na tukaandika programu-jalizi ya mypy (chanzo wazi), ambayo inaboresha usaidizi wa SQLAlchemy.

Shida tulizokutana nazo

Njia ya kufikia laini milioni 4 za msimbo uliochapwa haijawa rahisi kwetu kila wakati. Katika njia hii tulikutana na mashimo mengi na tulifanya makosa kadhaa. Haya ni baadhi ya matatizo tuliyokumbana nayo. Tunatumaini kwamba kuwaambia wengine kutasaidia kuepuka matatizo kama hayo.

Faili zinazokosekana. Tulianza kazi yetu kwa kuangalia faili ndogo tu. Chochote ambacho hakijajumuishwa kwenye faili hizi hakikuchaguliwa. Faili ziliongezwa kwenye orodha ya kuchanganua wakati ufafanuzi wa kwanza ulipoonekana ndani yao. Ikiwa kitu kiliingizwa kutoka kwa moduli iliyoko nje ya wigo wa uthibitishaji, basi tulikuwa tunazungumza juu ya kufanya kazi na maadili kama vile Any, ambazo hazijajaribiwa hata kidogo. Hii ilisababisha hasara kubwa ya usahihi wa kuandika, hasa katika hatua za mwanzo za uhamiaji. Njia hii imefanya kazi kwa kushangaza hadi sasa, ingawa hali ya kawaida ni kwamba kuongeza faili kwenye wigo wa hakiki kunaonyesha shida katika sehemu zingine za codebase. Katika hali mbaya zaidi, wakati maeneo mawili ya pekee ya kificho yaliunganishwa, ambayo, kwa kujitegemea kwa kila mmoja, aina tayari zimeangaliwa, ikawa kwamba aina za maeneo haya haziendani na kila mmoja. Hii ilisababisha hitaji la kufanya mabadiliko mengi kwa vidokezo. Tukiangalia nyuma sasa, tunagundua kuwa tunapaswa kuwa tumeongeza moduli za msingi za maktaba kwenye eneo la kuangalia la aina ya mypy mapema. Hii inaweza kufanya kazi yetu kutabirika zaidi.

Inabainisha msimbo wa zamani. Tulipoanza, tulikuwa na takriban mistari milioni 4 ya msimbo uliopo wa Python. Ilikuwa wazi kwamba kufafanua nambari hii yote haikuwa kazi rahisi. Tumeunda zana inayoitwa PyAnnotate ambayo inaweza kukusanya maelezo ya aina kadri majaribio yanavyoendeshwa na inaweza kuongeza maelezo ya aina kwenye msimbo wako kulingana na maelezo yaliyokusanywa. Hata hivyo, hatujaona kupitishwa kwa chombo hiki kwa kiasi kikubwa. Ukusanyaji wa maelezo ya aina ulikuwa wa polepole, na vidokezo vilivyotolewa kiotomatiki mara nyingi vilihitaji uhariri mwingi wa mikono. Tulifikiria kuhusu kutumia zana hii kiotomatiki kila tunapokagua msimbo, au kukusanya maelezo ya aina kulingana na kuchanganua kiasi kidogo cha maombi halisi ya mtandao, lakini tuliamua kutofanya hivyo kwa sababu mbinu mojawapo ilikuwa hatari sana.

Kama matokeo, inaweza kuzingatiwa kuwa nambari nyingi zilifafanuliwa kwa mikono na wamiliki wake. Ili kuelekeza mchakato huu katika mwelekeo ufaao, tunatayarisha ripoti kuhusu moduli na utendakazi muhimu ambazo zinahitaji kufafanuliwa. Kwa mfano, ni muhimu kutoa maelezo ya aina kwa moduli ya maktaba ambayo hutumiwa katika mamia ya maeneo. Lakini huduma ya zamani ambayo inabadilishwa na mpya sio muhimu sana kufafanua. Pia tunajaribu kutumia uchanganuzi tuli ili kutoa maelezo ya aina ya msimbo wa urithi.

Uagizaji wa baiskeli. Hapo juu, nilizungumza juu ya uagizaji wa mzunguko ("tangles za utegemezi"), uwepo ambao ulifanya iwe vigumu kuharakisha mypy. Pia tulilazimika kufanya kazi kwa bidii kufanya mypy kuunga mkono aina zote za nahau ambazo husababishwa na uagizaji huu wa mzunguko. Hivi majuzi tulikamilisha mradi mkubwa wa kuunda upya mfumo ambao ulisuluhisha maswala mengi ya mypy kuhusu uagizaji wa mduara. Matatizo haya kwa hakika yalitokana na siku za mapema sana za mradi, nyuma kutoka kwa Alore, lugha ya kielimu ambayo mradi wa mypy ulizingatia hapo awali. Sintaksia ya Alore hurahisisha kutatua matatizo na amri za uingizaji wa mzunguko. Mypy ya kisasa imerithi mapungufu kutoka kwa utekelezaji wake wa mapema, wenye nia rahisi (ambayo ilikuwa inafaa sana kwa Alore). Python hufanya kufanya kazi na uagizaji wa duara kuwa ngumu, haswa kwa sababu misemo haina utata. Kwa mfano, operesheni ya mgawo inaweza kufafanua aina ya pak. Mypy haiwezi kila wakati kugundua vitu kama hivi hadi kitanzi kikubwa cha uingizaji kimechakatwa. Hakukuwa na utata kama huo katika Alore. Maamuzi duni yaliyofanywa katika hatua za mwanzo za maendeleo ya mfumo yanaweza kutoa mshangao usio na furaha kwa programu miaka mingi baadaye.

Matokeo: njia ya mistari milioni 5 ya kanuni na upeo mpya

Mradi wa mypy umetoka mbali - kutoka kwa mifano ya mapema hadi mfumo unaodhibiti mistari milioni 4 ya aina za misimbo ya uzalishaji. Kama mypy iliibuka, vidokezo vya aina ya Python vilisawazishwa. Siku hizi, mfumo ikolojia wenye nguvu umeundwa karibu na kuandika msimbo wa Python. Ina mahali pa usaidizi wa maktaba, ina zana za msaidizi kwa IDE na wahariri, ina mifumo kadhaa ya udhibiti wa aina, ambayo kila mmoja ina faida na hasara zake.

Ingawa ukaguzi wa aina tayari umepewa kwenye Dropbox, ninaamini bado tuko katika siku za mwanzo za kuandika msimbo wa Python. Nadhani teknolojia za kukagua aina zitaendelea kubadilika na kuboreka.

Ikiwa bado haujatumia kuangalia kwa aina katika mradi wako mkubwa wa Python, basi ujue kuwa sasa ni wakati mzuri sana wa kuanza kuchapa tuli. Nimezungumza na wale ambao wamefanya mabadiliko kama hayo. Hakuna hata mmoja wao aliyejuta. Kuangalia aina hufanya Python kuwa lugha ambayo inafaa zaidi kukuza miradi mikubwa kuliko "Python ya kawaida."

Ndugu wasomaji! Unatumia kuangalia kwa aina katika miradi yako ya Python?

Njia ya kuangalia mistari milioni 4 ya nambari ya Python. Sehemu 3
Njia ya kuangalia mistari milioni 4 ya nambari ya Python. Sehemu 3

Chanzo: mapenzi.com

Kuongeza maoni