Chemen pou tcheke 4 milyon liy kòd Python. Pati 3

Nou prezante nan atansyon ou twazyèm pati nan tradiksyon an nan materyèl sou chemen an ke Dropbox te pran lè aplike yon sistèm tcheke tip pou kòd Python.

Chemen pou tcheke 4 milyon liy kòd Python. Pati 3

→ Pati anvan yo: premye и dezyèm fwa

Rive 4 milyon liy kòd tape

Yon lòt gwo defi (ak dezyèm enkyetid ki pi komen nan mitan moun ki te fè sondaj yo) te ogmante kantite kòd ki kouvri pa chèk kalite nan Dropbox. Nou te eseye plizyè apwòch pou rezoud pwoblèm sa a, soti nan grandi natirèlman gwosè kodbaz la tape pou konsantre efò ekip mypy a sou enferans kalite otomatik estatik ak dinamik. Nan fen a, li te sanble ke pa te gen okenn estrateji genyen senp, men nou te kapab reyalize kwasans rapid nan volim nan kòd anote pa konbine anpil apwòch.

Kòm yon rezilta, pi gwo repozitwa Python nou an (ak kòd backend) gen prèske 4 milyon liy kòd anote. Travay sou sezisman kòd estatik te fini nan apeprè twa ane. Mypy kounye a sipòte plizyè kalite rapò kouvèti kòd ki fè li pi fasil pou kontwole pwogrè sezisman. An patikilye, nou ka jenere rapò sou kòd ak anbigwite nan kalite, tankou, pou egzanp, itilizasyon klè nan yon kalite. Any nan anotasyon ki pa ka verifye, oswa ak bagay tankou enpòte bibliyotèk twazyèm pati ki pa gen anotasyon kalite. Kòm yon pati nan yon pwojè pou amelyore presizyon nan tcheke tip nan Dropbox, nou kontribye nan amelyore definisyon kalite yo (sa yo rele fichye souch) pou kèk bibliyotèk popilè sous louvri nan yon depo santralize Python. tape.

Nou aplike (ak estandadize nan PEPs ki vin apre) nouvo karakteristik nan sistèm nan kalite ki pèmèt kalite pi presi pou kèk modèl Python espesifik. Yon egzanp remakab nan sa a se TypeDict, ki bay kalite pou JSON-tankou diksyonè ki gen yon seri fiks kle fisèl, yo chak ak yon valè pwòp kalite pa yo. Nou pral kontinye elaji sistèm nan tip. Pwochen etap nou an ap gen chans pou amelyore sipò pou kapasite nimerik Python yo.

Chemen pou tcheke 4 milyon liy kòd Python. Pati 3
Kantite liy kòd anote: sèvè

Chemen pou tcheke 4 milyon liy kòd Python. Pati 3
Kantite liy kòd anote: kliyan

Chemen pou tcheke 4 milyon liy kòd Python. Pati 3
Kantite total liy kòd anote

Men yon apèsi sou karakteristik prensipal yo nan bagay sa yo nou te fè pou ogmante kantite kòd anote nan Dropbox:

Rigueur annotation. Nou piti piti ogmante egzijans yo pou rigueur nan anote nouvo kòd. Nou te kòmanse ak konsèy linter ki te sijere ajoute annotasyon nan dosye ki te deja gen kèk anotasyon. Koulye a, nou mande pou tip anotasyon nan nouvo dosye Python ak nan pifò fichye ki egziste deja.

Tape rapò. Nou voye ekip yo rapò chak semèn sou nivo nan sezisman nan kòd yo epi bay konsèy sou sa ki ta dwe anote an premye.

Popilarize mypy. Nou pale sou mypy nan evènman yo epi pale ak ekip yo pou ede yo kòmanse ak tip annotations.

Biwo vòt. Nou fè sondaj itilizatè peryodik pou idantifye gwo pwoblèm. Nou pare pou ale byen lwen nan rezoud pwoblèm sa yo (menm kreye yon nouvo lang pou akselere mypy!).

Pèfòmans. Nou amelyore pèfòmans mypy anpil lè nou itilize daemon ak mypyc. Sa a te fè pou lise enkonvenyan yo ki rive pandan pwosesis la anotasyon, epi yo nan lòd yo kapab travay ak gwo kantite kòd.

Entegrasyon ak editè. Nou te konstwi zouti pou sipòte kouri mypy nan editè ki popilè sou Dropbox. Sa a gen ladan PyCharm, Vim ak VS Code. Sa a anpil senplifye pwosesis la nan anote kòd la ak tcheke fonksyonalite li yo. Kalite aksyon sa yo komen lè y ap fè nòt kòd ki egziste deja.

Analiz estatik. Nou te kreye yon zouti pou dedwi siyati fonksyon yo lè l sèvi avèk zouti analiz estatik. Zouti sa a ka travay sèlman nan sitiyasyon relativman senp, men li te ede nou ogmante pwoteksyon kalite kòd nou an san anpil efò.

Sipò pou bibliyotèk twazyèm pati. Anpil nan pwojè nou yo itilize zouti SQLAlchemy. Li pran avantaj de kapasite dinamik Python ke kalite PEP 484 yo pa kapab modèl dirèkteman. Nou, an akò ak PEP 561, te kreye fichye souch ki koresponn lan epi nou te ekri yon plugin pou mypy (sous louvri), ki amelyore sipò SQLAlchemy.

Difikilte nou te rankontre

Chemen ki mennen nan 4 milyon liy kòd tape pa toujou fasil pou nou. Sou chemen sa a nou te rankontre anpil twou e nou te fè plizyè erè. Sa yo se kèk nan pwoblèm yo nou te rankontre. Nou espere ke pale sou yo pral ede lòt moun evite pwoblèm ki sanble.

Dosye ki manke yo. Nou te kòmanse travay nou pa tcheke sèlman yon ti kantite dosye. Nenpòt bagay ki pa enkli nan dosye sa yo pa t tcheke. Fichye yo te ajoute nan lis optik la lè premye anotasyon yo te parèt nan yo. Si yon bagay te enpòte soti nan yon modil ki sitiye andeyò sijè ki abòde lan verifikasyon, Lè sa a, nou te pale sou travay ak valè tankou Any, ki pa te teste ditou. Sa a te mennen nan yon pèt enpòtan nan presizyon sezisman, espesyalman nan premye etap yo nan migrasyon. Apwòch sa a te travay etonanman byen jiskaprezan, byenke yon sitiyasyon tipik se ke ajoute dosye nan sijè ki abòde lan revizyon an revele pwoblèm nan lòt pati nan kodbaz la. Nan ka ki pi mal la, lè de zòn izole nan kòd yo te fizyone, nan ki, poukont youn ak lòt, kalite yo te deja tcheke, li te tounen soti ke kalite zòn sa yo te enkonpatib youn ak lòt. Sa a te mennen nan nesesite pou fè anpil chanjman nan anotasyon yo. Gade tounen kounye a, nou reyalize ke nou ta dwe ajoute modil bibliyotèk debaz nan zòn tcheke kalite mypy a pi bonè. Sa ta fè travay nou pi previzib.

Anote ansyen kòd. Lè nou te kòmanse, nou te gen apeprè 4 milyon liy ki egziste deja kòd Python. Li te klè ke anote tout kòd sa a pa t 'yon travay fasil. Nou te kreye yon zouti ki rele PyAnnotate ki ka kolekte enfòmasyon sou kalite pandan tès yo ap kouri epi li ka ajoute annotasyon tip nan kòd ou a ki baze sou enfòmasyon yo kolekte. Sepandan, nou pa remake yon adopsyon patikilyèman toupatou nan zouti sa a. Rasanble enfòmasyon sou kalite a te ralanti, epi otomatikman te pwodwi anotasyon yo te souvan mande anpil modifikasyon manyèl. Nou te panse sou kouri zouti sa a otomatikman chak fwa nou revize kòd, oswa kolekte enfòmasyon sou kalite ki baze sou analiz kèk ti volim demann rezo aktyèl, men deside pa fè sa paske swa apwòch te twò riske.

Kòm yon rezilta, li ka remake ke pi fò nan kòd la te manyèlman anote pa mèt pwopriyete li yo. Pou nou ka gide pwosesis sa a nan bon direksyon, nou prepare rapò sou modil ak fonksyon patikilyèman enpòtan ki bezwen fè anote. Pa egzanp, li enpòtan pou bay tip annotations pou yon modil bibliyotèk ki te itilize nan plizyè santèn kote. Men, yon ansyen sèvis k ap ranplase ak yon nouvo pa enpòtan ankò pou annote. Nou ap fè eksperyans tou ak lè l sèvi avèk analiz estatik pou jenere tip anotasyon pou kòd eritaj.

Enpòtasyon siklik. Pi wo a, mwen te pale sou enpòtasyon siklik ("depandans tangles yo"), egzistans la ki te fè li difisil pou pi vit mypy. Nou menm tou nou te oblije travay di pou fè mypy sipòte tout kalite idiom ki te koze pa enpòtasyon siklik sa yo. Dènyèman, nou te konplete yon gwo pwojè redesign sistèm ki te rezoud pifò pwoblèm mypy konsènan enpòtasyon sikilè. Pwoblèm sa yo aktyèlman soti nan jou yo byen bonè nan pwojè a, tounen soti nan Alore, lang edikasyon an ki pwojè mypy a te orijinèlman konsantre sou. Alor sentaks fè li fasil pou rezoud pwoblèm ak kòmandman enpòte siklik. Modèn mypy te eritye kèk limit nan aplikasyon pi bonè li yo, ki senp (ki te yon bon anfòm pou Alore). Python fè travay ak enpòtasyon sikilè difisil, sitou paske ekspresyon yo se Limit. Pou egzanp, yon operasyon plasman ka aktyèlman defini yon alyas kalite. Mypy pa toujou kapab detekte bagay sa yo jiskaske pifò nan bouk enpòte yo te trete. Pa te gen okenn anbigwite konsa nan Alore. Desizyon pòv yo pran nan premye etap yo nan devlopman sistèm ka prezante yon sipriz dezagreyab nan pwogramè a anpil ane pita.

Rezilta: chemen ki mennen nan 5 milyon liy kòd ak nouvo orizon

Pwojè mypy la te vini yon fason lontan - soti nan pwototip bonè nan yon sistèm ki kontwole 4 milyon liy kalite kòd pwodiksyon. Kòm mypy te evolye, sijesyon kalite Python yo te estanda. Jou sa yo, yon ekosistèm pwisan devlope alantou sezisman kòd Python. Li gen yon kote pou sipò bibliyotèk, li gen zouti oksilyè pou IDE ak editè, li gen plizyè kalite sistèm kontwòl, chak nan yo ki gen pwòp avantaj ak dezavantaj.

Menm si chèk tip se deja yon bay nan Dropbox, mwen kwè nou toujou nan premye jou yo nan sezisman kòd Python. Mwen panse ke tip tcheke teknoloji yo ap kontinye evolye ak amelyore.

Si ou pa te deja itilize tip tcheke nan gwo echèl pwojè Python ou a, Lè sa a, konnen ke kounye a se yon trè bon moman yo kòmanse deplase nan sezisman estatik. Mwen te pale ak moun ki te fè yon tranzisyon menm jan an. Okenn nan yo pa regrèt sa. Tcheke kalite fè Python yon lang ki pi byen adapte pou devlope gwo pwojè pase "Python regilye."

Chè lektè! Èske w itilize tip tcheke nan pwojè Python ou yo?

Chemen pou tcheke 4 milyon liy kòd Python. Pati 3
Chemen pou tcheke 4 milyon liy kòd Python. Pati 3

Sous: www.habr.com

Add nouvo kòmantè