4 сая мөр Python кодын шивж шалгах зам. 3-р хэсэг

Python кодын төрлийг шалгах системийг нэвтрүүлэхдээ Dropbox-ын туулсан замын тухай материалын орчуулгын гурав дахь хэсгийг бид та бүхэнд толилуулж байна.

4 сая мөр Python кодын шивж шалгах зам. 3-р хэсэг

→ Өмнөх хэсгүүд: Эхнийх нь и хоёрдугаарт

4 сая мөр шивсэн код хүрч байна

Өөр нэг томоохон сорилт (мөн дотооддоо судалгаанд хамрагдсан хүмүүсийн хоёр дахь хамгийн нийтлэг асуудал) нь Dropbox дахь төрлийн шалгалтад хамрагдсан кодын хэмжээг нэмэгдүүлэх явдал байв. Бид энэ асуудлыг шийдэхийн тулд бичсэн кодын хэмжээг байгалийн жамаар нэмэгдүүлэхээс эхлээд mypy багийн хүчин чармайлтыг статик болон динамик автоматжуулсан төрлийн дүгнэлтэд төвлөрүүлэх хүртэл хэд хэдэн аргыг туршиж үзсэн. Эцсийн дүндээ ялах энгийн стратеги байхгүй юм шиг санагдаж байсан ч бид олон хандлагыг хослуулан тэмдэглэсэн кодын хэмжээг хурдацтай өсгөж чадсан.

Үүний үр дүнд манай хамгийн том Python репозитор (арын кодтой) бараг 4 сая мөр тайлбартай кодтой. Статик код бичих ажил ойролцоогоор гурван жилийн дотор хийгдсэн. Mypy нь одоо шивж бичих явцыг хянахад хялбар болгох олон төрлийн кодын хамрах тайлангуудыг дэмждэг. Ялангуяа бид төрлөөр тодорхойгүй кодын тайланг үүсгэж болно, жишээлбэл, төрлийг тодорхой ашиглах гэх мэт. Any баталгаажуулах боломжгүй тэмдэглэгээнд эсвэл төрлийн тэмдэглэгээгүй гуравдагч талын номын санг импортлох гэх мэт зүйлсээр. Dropbox дахь төрөл шалгах нарийвчлалыг сайжруулах төслийн хүрээнд бид Python-ын төвлөрсөн агуулах дахь зарим алдартай нээлттэй эхийн сангуудын төрлийн тодорхойлолтыг сайжруулахад хувь нэмрээ оруулсан. бичсэн.

Бид Python-ийн тодорхой загваруудад илүү нарийвчлалтай төрүүлэх боломжийг олгодог төрлийн системийн шинэ боломжуудыг хэрэгжүүлсэн (мөн дараагийн PEP-д стандартчилсан). Үүний тод жишээ бол TypeDict, тус бүр нь өөр өөрийн төрлийн утгатай, тогтмол багц тэмдэгт мөр бүхий JSON шиг толь бичгийн төрлүүдийг өгдөг. Бид төрөлжсөн системийг үргэлжлүүлэн өргөжүүлэх болно. Бидний дараагийн алхам бол Python-ийн тоон чадавхийг сайжруулах дэмжлэг байх болно.

4 сая мөр Python кодын шивж шалгах зам. 3-р хэсэг
Тайлбартай кодын мөрийн тоо: сервер

4 сая мөр Python кодын шивж шалгах зам. 3-р хэсэг
Тайлбартай кодын мөрийн тоо: үйлчлүүлэгч

4 сая мөр Python кодын шивж шалгах зам. 3-р хэсэг
Тайлбартай кодын нийт мөрийн тоо

Dropbox дахь тэмдэглэгээтэй кодын хэмжээг нэмэгдүүлэхийн тулд бидний хийсэн гол шинж чанаруудын тоймыг эндээс үзнэ үү.

Тайлбарын хатуу байдал. Бид шинэ кодын тэмдэглэгээний хатуу байдлын шаардлагыг аажмаар нэмэгдүүлсэн. Бид аль хэдийн зарим тэмдэглэгээтэй байсан файлуудад тайлбар нэмэхийг санал болгосон линтер зөвлөмжүүдээс эхэлсэн. Бид одоо шинэ Python файлууд болон одоо байгаа ихэнх файлуудад төрлийн тэмдэглэгээ шаардаж байна.

Тайлан бичиж байна. Бид долоо хоног бүр багуудад кодоо шивсэн байдлын талаарх тайланг илгээж, юун түрүүнд юуг тэмдэглэх талаар зөвлөгөө өгдөг.

Mypy-ийн түгээмэл байдал. Бид арга хэмжээн дээр mypy-ийн тухай ярьж, багуудтайгаа ярилцаж, бичвэрийн тэмдэглэгээ хийж эхлэхэд нь тусалдаг.

Санал асуулга. Бид томоохон асуудлуудыг тодорхойлохын тулд хэрэглэгчдийн дунд үе үе судалгаа явуулдаг. Бид эдгээр асуудлыг шийдвэрлэхэд нэлээд хол явахад бэлэн байна (тэр ч байтугай mypy-г хурдасгахын тулд шинэ хэл бий болгох!).

Гүйцэтгэл. Бид demon болон mypyc ашиглан mypy-ийн гүйцэтгэлийг ихээхэн сайжруулсан. Тэмдэглэгээ хийх явцад гарч буй таагүй байдлыг арилгах, их хэмжээний кодтой ажиллах боломжтой болгохын тулд үүнийг хийсэн.

Редакторуудтай нэгтгэх. Бид Dropbox дээр түгээмэл хэрэглэгддэг засварлагч дээр mypy-г ажиллуулахад туслах хэрэгслүүдийг бүтээсэн. Үүнд PyCharm, Vim болон VS код орно. Энэ нь кодын тайлбар хийх, түүний ажиллагааг шалгах үйл явцыг ихээхэн хялбаршуулсан. Эдгээр төрлийн үйлдлүүд нь одоо байгаа кодын тайлбар хийх үед түгээмэл байдаг.

Статик шинжилгээ. Бид статик шинжилгээний хэрэгслүүдийг ашиглан функцийн гарын үсгийг дүгнэх хэрэгслийг бүтээсэн. Энэ хэрэгсэл нь зөвхөн харьцангуй энгийн нөхцөлд ажиллах боломжтой боловч бидний кодын төрлийн хамрах хүрээг нэг их хүчин чармайлтгүйгээр нэмэгдүүлэхэд тусалсан.

Гуравдагч талын номын сангуудад дэмжлэг үзүүлэх. Манай төслүүдийн ихэнх нь SQLAlchemy хэрэгслийг ашигладаг. Python-ийн динамик чадавхийг ашиглан PEP 484 төрлүүд шууд загварчлах боломжгүй байдаг. Бид PEP 561-ийн дагуу харгалзах stub файлыг үүсгэж, mypy-д зориулсан залгаасыг бичсэн (нээлттэй эх сурвалж), SQLAlchemy дэмжлэгийг сайжруулдаг.

Бидэнд тулгарсан бэрхшээлүүд

4 сая мөр шивсэн код хүрэх зам бидний хувьд үргэлж амар байгаагүй. Энэ замд бид олон нүх сүвтэй тулгарч, хэд хэдэн алдаа гаргасан. Эдгээр нь бидний тулгарсан зарим асуудлууд юм. Тэдний тухай ярих нь бусдад үүнтэй төстэй асуудлуудаас зайлсхийхэд тусална гэж найдаж байна.

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

Хуучин кодыг тэмдэглэж байна. Биднийг эхлэхэд 4 сая орчим мөр Python кодтой байсан. Энэ бүх кодын тайлбар хийх нь тийм ч амар ажил биш гэдэг нь тодорхой байлаа. Бид PyAnnotate хэмээх хэрэгслийг бүтээсэн бөгөөд энэ нь туршилтын явцад төрлийн мэдээллийг цуглуулж, цуглуулсан мэдээлэлд үндэслэн кодонд төрлийн тайлбар нэмэх боломжтой. Гэсэн хэдий ч бид энэ хэрэгслийг өргөнөөр нэвтрүүлж байгааг анзаараагүй байна. Төрөл бүрийн мэдээллийг цуглуулах нь удаан байсан бөгөөд автоматаар үүсгэгдсэн тэмдэглэгээг ихэвчлэн олон гараар засварлах шаардлагатай болдог. Бид кодыг шалгах болгондоо энэ хэрэгслийг автоматаар ажиллуулах эсвэл бодит сүлжээний хүсэлтийн багахан хэмжээний дүн шинжилгээнд үндэслэн төрлийн мэдээлэл цуглуулах талаар бодож байсан ч аль нэг арга нь хэтэрхий эрсдэлтэй тул үүнийг хийхгүй гэж шийдсэн.

Үүний үр дүнд кодын ихэнх хэсгийг эзэд нь гараар тэмдэглэсэн болохыг тэмдэглэж болно. Энэ үйл явцыг зөв чиглэлд чиглүүлэхийн тулд бид онцгой чухал модулиуд болон тэмдэглэгээ хийх шаардлагатай функцүүдийн талаар тайлан бэлтгэдэг. Жишээлбэл, олон зуун газар ашигладаг номын сангийн модулийн төрлийн тайлбарыг өгөх нь чухал юм. Гэхдээ шинэ үйлчилгээгээр солигдож байгаа хуучин үйлчилгээг тэмдэглэх нь тийм ч чухал биш болсон. Бид мөн хуучин кодын төрлийн тэмдэглэгээг үүсгэхийн тулд статик шинжилгээг ашиглах туршилт хийж байна.

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

Үр дүн: 5 сая мөр код, шинэ давхрагад хүрэх зам

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

Төрөл шалгах нь Dropbox дээр аль хэдийн өгөгдсөн байсан ч бид Python кодыг бичиж эхэлсэн эхний өдрүүдэд байгаа гэдэгт би итгэж байна. Төрөл шалгах технологиуд үргэлжлэн хөгжиж, сайжирна гэж бодож байна.

Хэрэв та том хэмжээний Python төсөлдөө төрөл шалгах аргыг ашиглаж амжаагүй байгаа бол одоо статик бичих рүү шилжиж эхлэхэд маш тохиромжтой цаг гэдгийг мэдэж аваарай. Үүнтэй төстэй шилжилт хийсэн хүмүүстэй ярилцлаа. Тэдний хэн нь ч харамссангүй. Төрөл шалгах нь Python хэлийг "энгийн Python"-оос илүү том төслүүдийг боловсруулахад илүү тохиромжтой хэл болгодог.

Эрхэм уншигчид! Та Python төслүүддээ төрөл шалгах аргыг ашигладаг уу?

4 сая мөр Python кодын шивж шалгах зам. 3-р хэсэг
4 сая мөр Python кодын шивж шалгах зам. 3-р хэсэг

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх