Python кодының 4 миллион жолын теруді тексеру жолы. 3 бөлім

Назарларыңызға Python коды үшін типті тексеру жүйесін енгізу кезінде Dropbox жүріп өткен жол туралы материалды аударудың үшінші бөлігін ұсынамыз.

Python кодының 4 миллион жолын теруді тексеру жолы. 3 бөлім

→ Алдыңғы бөліктер: бірінші и екіншісі

Терілген кодтың 4 миллион жолына жетеді

Тағы бір маңызды мәселе (және ішкі сауалнамаға қатысқандар арасында ең көп кездесетін екінші мәселе) Dropbox-та типті тексерумен қамтылған код көлемін ұлғайту болды. Біз бұл мәселені шешудің бірнеше тәсілдерін қолданып көрдік, олар терілген кодтық базаның көлемін табиғи түрде ұлғайтудан бастап mypy командасының күш-жігерін статикалық және динамикалық автоматтандырылған түрдегі қорытындыға бағыттауға дейін. Ақырында, қарапайым жеңу стратегиясы жоқ сияқты көрінді, бірақ біз көптеген тәсілдерді біріктіру арқылы аннотацияланған код көлемінің жылдам өсуіне қол жеткізе алдық.

Нәтижесінде, біздің ең үлкен Python репозиторийінде (бағдарлама коды бар) аннотацияланған кодтың 4 миллионға жуық жолы бар. Статикалық кодты теру бойынша жұмыс шамамен үш жылда аяқталды. Mypy енді теру барысын бақылауды жеңілдететін кодты қамту есептерінің әртүрлі түрлерін қолдайды. Атап айтқанда, біз, мысалы, түрді анық пайдалану сияқты түрлерде түсініксіз кодтар туралы есептерді жасай аламыз. Any тексеруге болмайтын аннотацияларда немесе түрі аннотациялары жоқ үшінші тарап кітапханаларын импорттау сияқты нәрселерде. Dropbox жүйесіндегі типті тексерудің дәлдігін жақсарту жобасының бөлігі ретінде біз орталықтандырылған Python репозиторийіндегі кейбір танымал ашық бастапқы кітапханалар үшін тип анықтамаларын (қоқыс файлдар деп аталатын) жақсартуға үлес қостық. терілген.

Біз кейбір Python үлгілері үшін дәлірек түрлерге мүмкіндік беретін типтік жүйенің жаңа мүмкіндіктерін енгіздік (және кейінгі PEP-де стандартталған). Мұның көрнекті мысалы TypeDict, ол әрқайсысы өз түрінің мәні бар жол пернелерінің бекітілген жиыны бар JSON тәрізді сөздіктердің түрлерін қамтамасыз етеді. Біз типтік жүйені кеңейтуді жалғастырамыз. Біздің келесі қадамымыз Python-ның сандық мүмкіндіктерін қолдауды жақсарту болуы мүмкін.

Python кодының 4 миллион жолын теруді тексеру жолы. 3 бөлім
Аннотацияланған код жолдарының саны: сервер

Python кодының 4 миллион жолын теруді тексеру жолы. 3 бөлім
Аннотацияланған код жолдарының саны: клиент

Python кодының 4 миллион жолын теруді тексеру жолы. 3 бөлім
Аннотацияланған код жолдарының жалпы саны

Dropbox-та аннотацияланған кодтың көлемін ұлғайту үшін біз жасаған нәрселердің негізгі мүмкіндіктеріне шолу:

Аннотацияның қатаңдығы. Біз жаңа кодты аннотациялаудың қатаңдығына қойылатын талаптарды біртіндеп арттырдық. Біз кейбір аннотациялары бар файлдарға аннотацияларды қосуды ұсынған линтер кеңестерінен бастадық. Біз енді жаңа Python файлдарында және бар файлдардың көпшілігінде типтік аннотацияларды талап етеміз.

Есептерді теру. Біз командаларға олардың кодын теру деңгейі туралы апта сайынғы есептерді жібереміз және алдымен нені түсіндіру керектігі туралы кеңес береміз.

Мипиді танымал ету. Біз іс-шараларда mypy туралы сөйлесеміз және типтік аннотацияларды бастауға көмектесу үшін топтармен сөйлесеміз.

Сауалнамалар. Біз негізгі проблемаларды анықтау үшін пайдаланушыларға мерзімді сауалнама жүргіземіз. Біз бұл мәселелерді шешуде айтарлықтай алысқа баруға дайынбыз (тіпті mypy жылдамдығын арттыру үшін жаңа тіл жасау!).

Өнімділік. Демон мен mypyc көмегімен біз mypy өнімділігін айтарлықтай жақсарттық. Бұл аннотация процесінде пайда болатын қолайсыздықтарды тегістеу және үлкен көлемдегі кодпен жұмыс істей алу үшін жасалды.

Редакторлармен интеграция. Dropbox жүйесінде танымал редакторларда mypy іске қосуға қолдау көрсететін құралдарды жасадық. Бұған PyCharm, Vim және VS коды кіреді. Бұл кодты аннотациялау және оның функционалдығын тексеру процесін айтарлықтай жеңілдетті. Бұл әрекеттер түрлері бар кодты аннотациялау кезінде жиі кездеседі.

Статикалық талдау. Біз статикалық талдау құралдарын пайдаланып функция қолтаңбаларын шығару құралын жасадық. Бұл құрал салыстырмалы түрде қарапайым жағдайларда ғана жұмыс істей алады, бірақ ол бізге көп күш жұмсамай-ақ код түрін қамтуды арттыруға көмектесті.

Үшінші тарап кітапханаларына қолдау көрсету. Көптеген жобаларымыз SQLAlchemy құралдар жинағын пайдаланады. Python динамикалық мүмкіндіктерін пайдаланады, PEP 484 түрлері тікелей модельдеуге қабілетсіз. Біз, PEP 561 сәйкес, сәйкес stub файлын жасап, mypy үшін плагин жаздық (ашық дереккөз), бұл SQLAlchemy қолдауын жақсартады.

Біз кездескен қиындықтар

Терілген кодтың 4 миллион жолына жету жолы біз үшін әрқашан оңай болған жоқ. Бұл жолда біз көптеген шұңқырларға тап болып, бірнеше қателіктер жібердік. Бұл біз кездестірген кейбір мәселелер. Олар туралы айту басқаларға ұқсас проблемаларды болдырмауға көмектеседі деп үміттенеміз.

Жетіспейтін файлдар. Біз жұмысымызды аз ғана көлемдегі файлдарды тексеруден бастадық. Бұл файлдарға қосылмаған кез келген нәрсе тексерілмеген. Файлдар сканерлеу тізіміне оларда алғашқы аннотациялар пайда болған кезде қосылды. Егер бірдеңе тексеру шеңберінен тыс орналасқан модульден импортталған болса, онда біз келесідей мәндермен жұмыс істеу туралы сөйлескен едік. Any, олар мүлдем тексерілмеген. Бұл әсіресе көшудің бастапқы кезеңдерінде теру дәлдігінің айтарлықтай жоғалуына әкелді. Бұл әдіс осы уақытқа дейін таңқаларлықтай жақсы жұмыс істеді, дегенмен әдеттегі жағдай шолу көлеміне файлдарды қосу кодтық базаның басқа бөліктеріндегі мәселелерді көрсетеді. Ең нашар жағдайда, кодтың екі оқшауланған аймағы біріктірілгенде, олардың түрлері бір-бірінен тәуелсіз тексерілген болса, бұл аймақтардың түрлері бір-бірімен үйлеспейді. Бұл аннотацияларға көптеген өзгерістер енгізу қажеттілігіне әкелді. Енді артқа қарасақ, біз mypy түрін тексеру аймағына негізгі кітапхана модульдерін ертерек қосуымыз керек екенін түсінеміз. Бұл біздің жұмысымызды әлдеқайда болжамды етеді.

Ескі кодты аннотациялау. Біз бастаған кезде бізде бар Python кодының шамамен 4 миллион жолы болды. Осы кодтың барлығына түсініктеме беру оңай шаруа емес екені анық болды. Біз PyAnnotate деп аталатын құралды жасадық, ол сынақтар орындалған кезде түр туралы ақпаратты жинай алады және жиналған ақпарат негізінде кодыңызға түр аннотацияларын қоса алады. Дегенмен, біз бұл құралдың ерекше кең таралғанын байқамадық. Түр туралы ақпаратты жинау баяу болды және автоматты түрде жасалған аннотациялар жиі қолмен өңдеуді қажет етеді. Біз кодты қарап шыққан сайын бұл құралды автоматты түрде іске қосуды немесе нақты желі сұрауларының кейбір шағын көлемін талдауға негізделген түр туралы ақпаратты жинауды ойладық, бірақ екі тәсіл де тым қауіпті болғандықтан, бұл құралды қолданбауды шештік.

Нәтижесінде, кодтың көпшілігіне оның иелері қолмен түсініктеме бергенін атап өтуге болады. Бұл процесті дұрыс бағытта басқару үшін біз аннотацияны қажет ететін ерекше маңызды модульдер мен функциялар туралы есептерді дайындаймыз. Мысалы, жүздеген жерлерде қолданылатын кітапхана модулі үшін типтік аннотацияларды қамтамасыз ету маңызды. Бірақ жаңасымен ауыстырылып жатқан ескі қызмет енді аннотация жасау соншалықты маңызды емес. Біз сондай-ақ бұрынғы код үшін типтік аннотацияларды жасау үшін статикалық талдауды пайдалану арқылы тәжірибе жасап жатырмыз.

Циклдік импорт. Жоғарыда мен циклдік импорт туралы айттым («тәуелділік шиеленістер»), оның болуы mypy жылдамдығын қиындатады. Сондай-ақ, mypy осы циклдік импорттан туындаған идиомалардың барлық түрлерін қолдау үшін көп жұмыс істеуге тура келді. Жақында біз айналымдық импортқа қатысты mypy мәселелерінің көпшілігін түзететін жүйені қайта құрудың негізгі жобасын аяқтадық. Бұл мәселелер шын мәнінде жобаның ең алғашқы күндерінен, mypy жобасы бастапқыда бағдарланған білім беру тілі Alore-дан туындады. Alore синтаксисі циклдік импорт пәрмендерімен мәселелерді шешуді жеңілдетеді. Заманауи mypy бұрынғы, қарапайым іске асырудан кейбір шектеулерді мұра етті (бұл Alore үшін өте қолайлы болды). Python айналмалы импортпен жұмыс істеуді қиындатады, себебі өрнектер анық емес. Мысалы, тағайындау әрекеті түрдің бүркеншік атын нақты анықтауы мүмкін. Импорттық циклдің көп бөлігі өңделмейінше Mypy әрқашан осындай нәрселерді анықтай алмайды. Алореде мұндай екіұштылықтар болған жоқ. Жүйені дамытудың бастапқы кезеңдерінде қабылданған нашар шешімдер көптеген жылдардан кейін бағдарламашыға жағымсыз тосын сыйды тудыруы мүмкін.

Нәтижелер: кодтың 5 миллион жолына және жаңа көкжиектерге жол

mypy жобасы ұзақ жолдан өтті - ерте прототиптерден 4 миллион жолдық өндіріс код түрлерін басқаратын жүйеге дейін. Mypy дамыған сайын Python типті кеңестер стандартталған. Бұл күндері Python кодын теру айналасында қуатты экожүйе дамыды. Оның кітапханалық қолдауға арналған орны бар, оның құрамында IDE және редакторларға арналған көмекші құралдар бар, оның бірнеше типті басқару жүйесі бар, олардың әрқайсысының өз артықшылықтары мен кемшіліктері бар.

Түрді тексеру Dropbox-та берілген болса да, біз әлі де Python кодын терудің алғашқы күндерінде екенбіз деп ойлаймын. Менің ойымша, типті тексеру технологиялары дамып, жетілдіре береді.

Егер сіз кең ауқымды Python жобаңызда типті тексеруді пайдаланбаған болсаңыз, қазір статикалық теруге көшуді бастау үшін өте жақсы уақыт екенін біліңіз. Мен осыған ұқсас ауысуды жасағандармен сөйлестім. Олардың ешқайсысы өкінген жоқ. Түрді тексеру Python тілін «қалыпты Python» тіліне қарағанда үлкен жобаларды әзірлеуге жақсырақ тіл етеді.

Құрметті оқырмандар! Python жобаларында типті тексеруді қолданасыз ба?

Python кодының 4 миллион жолын теруді тексеру жолы. 3 бөлім
Python кодының 4 миллион жолын теруді тексеру жолы. 3 бөлім

Ақпарат көзі: www.habr.com

пікір қалдыру