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 жөнүндө сүйлөшөбүз жана типтеги аннотацияларды баштоого жардам берүү үчүн командалар менен сүйлөшөбүз.

Сурамжылоолор. Негизги көйгөйлөрдү аныктоо үчүн биз мезгил-мезгили менен колдонуучулар сурамжылоосун өткөрөбүз. Биз бул проблемаларды чечууде алда канча алыска барууга даярбыз (ал турсун mypy тездетуу учун жаны тилди тузуу да!).

Performance. Демонду жана mypycти колдонуу менен биз mypyдин иштешин бир кыйла жакшырттык. Бул аннотациялоо процессинде пайда болгон ыңгайсыздыктарды жоюу жана чоң көлөмдөгү код менен иштөө үчүн жасалган.

Редакторлор менен интеграция. Dropbox'то популярдуу болгон редакторлордо mypy иштетүүнү колдоо үчүн куралдарды курдук. Бул PyCharm, Vim жана VS Code камтыйт. Бул кодду аннотациялоо жана анын иштешин текшерүү процессин абдан жөнөкөйлөттү. Учурдагы кодду аннотациялоодо мындай аракеттер кеңири таралган.

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

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

Биз туш болгон кыйынчылыктар

Терилген коддун 4 миллион сапка чейинки жолу биз үчүн дайыма эле оңой болгон эмес. Бул жолдо биз көптөгөн чуңкурларга туш болуп, бир нече ката кетирдик. Булар биз туш болгон көйгөйлөрдүн айрымдары. Алар жөнүндө айтып берүү башкаларга ушул сыяктуу көйгөйлөрдөн качууга жардам берет деп үмүттөнөбүз.

Файлдар жок. Биз ишибизди аз гана көлөмдөгү файлдарды текшерүүдөн баштадык. Бул файлдарга кирбеген нерселер текшерилген эмес. Файлдар сканерлөө тизмесине биринчи аннотациялар пайда болгондо кошулган. Эгер бир нерсе текшерүү аймагынан тышкары жайгашкан модулдан импорттолгон болсо, анда биз төмөнкүдөй баалуулуктар менен иштөө жөнүндө сүйлөшүп жатканбыз. Any, алар такыр сыналган эмес. Бул, айрыкча миграциянын алгачкы этабында терүүнүн тактыгынын олуттуу жоголушуна алып келди. Бул ыкма ушул убакка чейин таң калыштуу жакшы иштеди, бирок типтүү жагдай карап чыгуунун аймагына файлдарды кошуу код базасынын башка бөлүктөрүндө көйгөйлөрдү ачып берет. Эң начар учурда, бири-биринен көз карандысыз типтер текшерилген коддун эки обочолонгон аймагы бириктирилгенде, бул аймактардын түрлөрү бири-бирине шайкеш келбей турганы белгилүү болду. Бул аннотацияларга көптөгөн өзгөртүүлөрдү киргизүү зарылчылыгына алып келди. Азыр артка кылчайып, биз mypy'тин түрүн текшерүү аймагына китепкананын негизги модулдарын эртерээк кошушубуз керек экенин түшүнөбүз. Бул биздин ишибизди алда канча алдын ала айтууга болот.

Эски кодду түшүндүрүү. Биз баштаганда бизде Python кодунун 4 миллион саптары бар болчу. Бул коддун баарын аннотациялоо оңой иш эмес экени айкын болду. Биз PyAnnotate деп аталган куралды түздүк, ал тесттер жүрүп жатканда түр маалыматын чогулта алат жана чогултулган маалыматтын негизинде кодуңузга тип аннотацияларын кошо алат. Бирок, биз бул куралдын өзгөчө кеңири таралганын байкай элекпиз. Тип боюнча маалыматты чогултуу жай болгон жана автоматтык түрдө түзүлгөн аннотациялар көп кол менен түзөтүүнү талап кылган. Кодду карап чыккан сайын бул куралды автоматтык түрдө иштетүү же анык тармак сурамдарынын бир аз көлөмүн талдоонун негизинде тип маалыматын чогултуу жөнүндө ойлонгонбуз, бирок эки ыкманын бири да өтө кооптуу болгондуктан, андай болбоону чечтик.

Натыйжада, бул коддун көпчүлүгү кол менен анын ээлери тарабынан аннотацияланган экенин белгилей кетүү керек. Бул процессти туура багытка буруу үчүн биз аннотациялоону талап кылган өзгөчө маанилүү модулдар жана функциялар боюнча отчетторду даярдайбыз. Мисалы, жүздөгөн жерлерде колдонулган китепкана модулу үчүн типтеги аннотацияларды берүү маанилүү. Бирок жаңысы менен алмаштырылып жаткан эски кызматка аннотация берүү анчалык деле маанилүү эмес. Биз ошондой эле эски код үчүн типтеги аннотацияларды түзүү үчүн статикалык анализди колдонуу менен эксперимент жүргүзүп жатабыз.

Циклдик импорт. Жогоруда мен циклдик импорт ("көз карандылык чыр-чатактары") жөнүндө айттым, анын болушу mypyди тездетүүнү кыйындаткан. Ошондой эле бул циклдик импорт менен шартталган идиомалардын бардык түрлөрүн mypy колдоого алуу үчүн көп аракет кылышыбыз керек болчу. Биз жакында эле айланма импортко байланыштуу mypy көйгөйлөрүнүн көбүн чечкен системаны кайра долбоорлоо боюнча ири долбоорду аяктадык. Бул көйгөйлөр чындыгында долбоордун эң алгачкы күндөрүнөн тартып, mypy долбоору алгач багытталган билим берүү тили Алореден келип чыккан. Alore синтаксиси циклдик импорт буйруктары менен көйгөйлөрдү чечүүнү жеңилдетет. Заманбап mypy анын алгачкы, татаал эмес ишке ашырылышынан кээ бир чектөөлөрдү мурастап алды (бул Alore үчүн абдан ылайыктуу болгон). Python тегерек импорт менен иштөөнү кыйындатат, себеби туюнтмалар түшүнүксүз. Мисалы, дайындоо операциясы иш жүзүндө түр лакап атын аныкташы мүмкүн. Импорттук циклдин көбү иштетилмейинче Mypy дайыма эле ушул сыяктуу нерселерди таба албайт. Алореде мындай эки ачалыктар болгон эмес. Системаны өнүктүрүүнүн алгачкы этаптарында кабыл алынган туура эмес чечимдер көп жылдардан кийин программистке жагымсыз сюрприз тартуулайт.

Натыйжалар: 5 миллион сап кодго жана жаңы горизонтторго жол

mypy долбоору узак жолду басып өттү - алгачкы прототиптерден өндүрүш кодунун түрлөрүнүн 4 миллион линиясын башкарган системага чейин. Mypy өнүккөн сайын, Python түрү боюнча ишарат стандартташтырылган. Бул күндөрү Python кодун терүүнүн тегерегинде күчтүү экосистема өнүккөн. Бул китепкананы колдоо үчүн орун бар, ал IDE жана редакторлор үчүн көмөкчү куралдарды камтыйт, анын бир нече түрү башкаруу системалары бар, алардын ар биринин өзүнүн жакшы жана жаман жактары бар.

Типти текшерүү Dropboxто мурунтан эле берилген болсо да, мен Python кодун терүүнүн алгачкы күндөрүндө экенибизге ишенем. Мен типти текшерүү технологиялары өнүгүп, өркүндөтүлөт деп ойлойм.

Эгер сиз масштабдуу Python долбооруңузда типти текшерүүнү колдоно элек болсоңуз, анда азыр статикалык терүүгө өтүүнү баштоо үчүн абдан жакшы убакыт экенин билиңиз. Ушундай эле өткөөлдү жасагандар менен сүйлөштүм. Алардын эч кимиси өкүнгөн жок. Типти текшерүү Pythonду "кадимки Python" га караганда чоң долбоорлорду иштеп чыгууга жакшыраак тил кылат.

Урматтуу окурмандар! Python долбоорлоруңузда типти текшерүүнү колдоносузбу?

Python кодунун 4 миллион саптарын терүүнүн жолу. 3-бөлүк
Python кодунун 4 миллион саптарын терүүнүн жолу. 3-бөлүк

Source: www.habr.com

Комментарий кошуу