4 million satr Python kodini terishni tekshirish yo'li. 3-qism

Biz sizning e'tiboringizga Python kodining turini tekshirish tizimini joriy qilishda Dropbox bosib o'tgan yo'l haqidagi material tarjimasining uchinchi qismini taqdim etamiz.

4 million satr Python kodini terishni tekshirish yo'li. 3-qism

→ Oldingi qismlar: birinchi и ikkinchi

4 million qator terilgan kodga yetdi

Yana bir muhim muammo (va ichki so'rovda qatnashganlar orasida ikkinchi eng keng tarqalgan tashvish) Dropbox-da turdagi tekshiruvlar bilan qoplangan kod miqdorini oshirish edi. Biz ushbu muammoni hal qilish uchun bir nechta yondashuvlarni sinab ko'rdik, ular kiritilgan kodlar bazasi hajmini tabiiy ravishda oshirishdan tortib mypy jamoasining harakatlarini statik va dinamik avtomatlashtirilgan turdagi xulosaga qaratishgacha. Oxir-oqibat, g'alaba qozonishning oddiy strategiyasi yo'qdek tuyuldi, ammo biz ko'plab yondashuvlarni birlashtirib, izohli kod hajmining tez o'sishiga erishdik.

Natijada, bizning eng katta Python omborimiz (backend kodi bilan) deyarli 4 million satr izohli kodga ega. Statik kodlarni yozish bo'yicha ish taxminan uch yil ichida yakunlandi. Mypy endi yozish jarayonini kuzatishni osonlashtiradigan har xil turdagi kod qamrovi hisobotlarini qo'llab-quvvatlaydi. Xususan, biz turdagi noaniqliklar bilan kod bo'yicha hisobotlarni yaratishimiz mumkin, masalan, turdagi aniq foydalanish Any tasdiqlab bo'lmaydigan izohlarda yoki turdagi izohlari bo'lmagan uchinchi tomon kutubxonalarini import qilish kabi narsalar bilan. Dropbox-da turdagi tekshirishning aniqligini oshirish loyihasi doirasida biz Python-ning markazlashtirilgan omboridagi ba'zi mashhur ochiq manba kutubxonalari uchun turdagi ta'riflarni (nota fayllar deb ataladi) yaxshilashga hissa qo'shdik. yozilgan.

Biz ba'zi o'ziga xos Python naqshlari uchun aniqroq turlarga ruxsat beruvchi turdagi tizimning yangi xususiyatlarini joriy qildik (va keyingi PEPlarda standartlashtirdik). Bunga yorqin misol TypeDict, bu JSON-ga o'xshash lug'atlar uchun turlarni taqdim etadi, ularning har biri o'z turidagi qiymatga ega bo'lgan qat'iy qatorli kalitlarga ega. Biz turdagi tizimni kengaytirishni davom ettiramiz. Bizning keyingi qadamimiz Python-ning raqamli imkoniyatlarini qo'llab-quvvatlashni yaxshilash bo'lishi mumkin.

4 million satr Python kodini terishni tekshirish yo'li. 3-qism
Izohlangan kod satrlari soni: server

4 million satr Python kodini terishni tekshirish yo'li. 3-qism
Izohlangan kod satrlari soni: mijoz

4 million satr Python kodini terishni tekshirish yo'li. 3-qism
Izohlangan kod satrlarining umumiy soni

Dropbox-da izohli kod miqdorini oshirish uchun qilgan ishlarning asosiy xususiyatlari haqida qisqacha ma'lumot:

Annotatsiyaning qat'iyligi. Biz yangi kodni izohlashning qat'iyligi uchun talablarni asta-sekin oshirdik. Biz ba'zi izohlari bo'lgan fayllarga izoh qo'shishni taklif qiladigan linter maslahatlaridan boshladik. Biz endi yangi Python fayllarida va ko'pgina mavjud fayllarda turdagi izohlarni talab qilamiz.

Hisobotlarni yozish. Biz jamoalarga ularning kodini kiritish darajasi haqida haftalik hisobotlarni yuboramiz va birinchi navbatda nima izohlash kerakligi haqida maslahat beramiz.

Mypyni ommalashtirish. Biz tadbirlarda mypy haqida gaplashamiz va jamoalar bilan suhbatlashamiz, ularga izohlarni yozishni boshlashga yordam beramiz.

So'rovlar. Biz asosiy muammolarni aniqlash uchun vaqti-vaqti bilan foydalanuvchi so'rovlarini o'tkazamiz. Biz bu muammolarni hal qilishda ancha uzoqqa borishga tayyormiz (hatto mypy tezligini oshirish uchun yangi til yaratish ham!).

Ishlash. Demon va mypyc yordamida biz mypy ish faoliyatini sezilarli darajada yaxshiladik. Bu izohlash jarayonida yuzaga keladigan noqulayliklarni yumshatish va katta hajmdagi kodlar bilan ishlay olish uchun qilingan.

Muharrirlar bilan integratsiya. Biz Dropbox-da mashhur bo'lgan muharrirlarda mypy-ni ishga tushirishni qo'llab-quvvatlash vositalarini yaratdik. Bunga PyCharm, Vim va VS kodlari kiradi. Bu kodni izohlash va uning funksionalligini tekshirish jarayonini ancha soddalashtirdi. Mavjud kodni izohlashda bunday harakatlar keng tarqalgan.

Statik tahlil. Biz statik tahlil vositalaridan foydalanib, funksiya imzolarini aniqlash uchun vosita yaratdik. Ushbu vosita faqat nisbatan oddiy vaziyatlarda ishlashi mumkin, ammo bu bizga ko'p harakat qilmasdan kod turlarini qamrab olishni oshirishga yordam berdi.

Uchinchi tomon kutubxonalarini qo'llab-quvvatlash. Ko'pgina loyihalarimiz SQLAlchemy asboblar to'plamidan foydalanadi. Python-ning dinamik imkoniyatlaridan foydalanadi, PEP 484 turlari to'g'ridan-to'g'ri modellashtira olmaydi. Biz, PEP 561 ga muvofiq, tegishli stub faylini yaratdik va mypy uchun plagin yozdik (ochiq manba), bu SQLAlchemy yordamini yaxshilaydi.

Biz duch kelgan qiyinchiliklar

4 million satr terilgan kod yo'li biz uchun har doim ham oson bo'lmagan. Bu yo'lda biz ko'plab chuqurlarga duch keldik va bir nechta xatolarga yo'l qo'ydik. Bular biz duch kelgan ba'zi muammolar. Umid qilamizki, ular haqida gapirish boshqalarga o'xshash muammolardan qochishga yordam beradi.

Yo'qolgan fayllar. Biz ishimizni faqat kichik hajmdagi fayllarni tekshirishdan boshladik. Ushbu fayllarga kiritilmagan narsalar tekshirilmagan. Fayllar skanerlash ro'yxatiga ularda birinchi izohlar paydo bo'lganda qo'shildi. Agar biror narsa tekshirish doirasidan tashqarida joylashgan moduldan import qilingan bo'lsa, biz shunga o'xshash qiymatlar bilan ishlash haqida gapirgan edik. Any, ular umuman sinovdan o'tkazilmagan. Bu, ayniqsa, migratsiyaning dastlabki bosqichlarida yozish aniqligini sezilarli darajada yo'qotishiga olib keldi. Ushbu yondashuv hozirgacha hayratlanarli darajada yaxshi ishladi, garchi odatiy holat shundaki, fayllarni ko'rib chiqish doirasiga qo'shish kodlar bazasining boshqa qismlarida muammolarni aniqlaydi. Eng yomon holatda, kodning ikkita ajratilgan sohasi birlashtirilganda, ular bir-biridan mustaqil ravishda allaqachon tekshirilganda, ushbu sohalarning turlari bir-biriga mos kelmasligi ma'lum bo'ldi. Bu annotatsiyalarga ko'plab o'zgartirishlar kiritish zarurligiga olib keldi. Endi orqaga nazar tashlasak, biz mypy turini tekshirish maydoniga asosiy kutubxona modullarini tezroq qo'shishimiz kerakligini tushunamiz. Bu bizning ishimizni yanada bashoratli qiladi.

Eski kodni izohlash. Biz boshlaganimizda, bizda mavjud Python kodining taxminan 4 million satri bor edi. Bu kodlarning barchasini izohlash oson ish emasligi aniq edi. Biz PyAnnotate nomli vositani yaratdik, u testlar oʻtkazilayotganda tur maʼlumotlarini toʻplashi va toʻplangan maʼlumotlar asosida kodingizga turdagi izohlarni qoʻshishi mumkin. Biroq, biz ushbu vositaning ayniqsa keng tarqalganligini sezmadik. Tur ma'lumotlarini yig'ish sekin edi va avtomatik ravishda yaratiladigan izohlar ko'pincha qo'lda tahrirlashni talab qiladi. Biz har safar kodni ko‘rib chiqqanimizda ushbu vositani avtomatik ravishda ishga tushirish yoki kichik hajmdagi haqiqiy tarmoq so‘rovlarini tahlil qilish asosida turdagi ma’lumotlarni yig‘ish haqida o‘yladik, lekin har ikkala yondashuv ham juda xavfli bo‘lgani uchun bunday qilmaslikka qaror qildik.

Natijada, kodning aksariyat qismi egalari tomonidan qo'lda izohlanganligini ta'kidlash mumkin. Ushbu jarayonni to'g'ri yo'nalishga yo'naltirish uchun biz izohlash kerak bo'lgan alohida muhim modullar va funktsiyalar bo'yicha hisobotlarni tayyorlaymiz. Misol uchun, yuzlab joylarda ishlatiladigan kutubxona moduli uchun turdagi izohlarni taqdim etish muhimdir. Ammo yangisi bilan almashtirilayotgan eski xizmat endi izoh berish unchalik muhim emas. Biz, shuningdek, eski kod uchun turdagi izohlarni yaratish uchun statik tahlildan foydalanishni sinab ko'rmoqdamiz.

Tsiklik import. Yuqorida men tsiklik import ("qaramlik chalkashliklari") haqida gapirdim, ularning mavjudligi mypyni tezlashtirishni qiyinlashtirdi. Shuningdek, mypy-ni ushbu tsiklik importlar tufayli yuzaga keladigan barcha turdagi idiomalarni qo'llab-quvvatlash uchun ko'p mehnat qilishimiz kerak edi. Biz yaqinda tizimni qayta loyihalash bo‘yicha yirik loyihani yakunladik, u mypy’ning sirkulyar import bilan bog‘liq aksariyat muammolarini hal qildi. Bu muammolar, aslida, mypy loyihasi dastlab yo'naltirilgan ta'lim tili Alore'dan, loyihaning dastlabki kunlaridan kelib chiqqan. Alore sintaksisi siklik import buyruqlari bilan bog'liq muammolarni hal qilishni osonlashtiradi. Zamonaviy mypy o'zining dastlabki, murakkab bo'lmagan qo'llanilishidan ba'zi cheklovlarni meros qilib oldi (bu Alore uchun juda mos edi). Python dumaloq importlar bilan ishlashni qiyinlashtiradi, chunki iboralar noaniq. Masalan, tayinlash operatsiyasi aslida turdagi taxallusni belgilashi mumkin. Import siklining katta qismi qayta ishlanmaguncha Mypy har doim ham bunday narsalarni aniqlay olmaydi. Aloreda bunday noaniqliklar yo'q edi. Tizim rivojlanishining dastlabki bosqichlarida qabul qilingan noto'g'ri qarorlar ko'p yillar o'tib dasturchiga yoqimsiz kutilmagan hodisalar keltirishi mumkin.

Natijalar: 5 million qator kod va yangi ufqlarga yo'l

Mypy loyihasi uzoq yo'lni bosib o'tdi - dastlabki prototiplardan 4 million qator ishlab chiqarish kodlari turlarini boshqaradigan tizimgacha. Mypy rivojlanishi bilan Python tipidagi maslahatlar standartlashtirildi. Shu kunlarda Python kodini yozish atrofida kuchli ekotizim rivojlandi. U kutubxonani qo'llab-quvvatlash uchun joy bor, u IDE va ​​muharrirlar uchun yordamchi vositalarni o'z ichiga oladi, u bir nechta turdagi boshqaruv tizimlariga ega, ularning har biri o'zining ijobiy va salbiy tomonlariga ega.

Turni tekshirish Dropbox-da allaqachon berilgan bo'lsa-da, menimcha, biz hali ham Python kodini yozishning dastlabki kunlaridamiz. Menimcha, tipni tekshirish texnologiyalari rivojlanishda va takomillashishda davom etadi.

Agar siz keng miqyosli Python loyihangizda tipni tekshirishdan hali foydalanmagan bo'lsangiz, bilingki, hozir statik yozishga o'tish uchun juda yaxshi vaqt. Men shunga o'xshash o'tishni amalga oshirganlar bilan gaplashdim. Ularning hech biri bundan afsuslanmadi. Turni tekshirish Pythonni yirik loyihalarni ishlab chiqish uchun "odatiy Python" ga qaraganda ancha mos bo'lgan tilga aylantiradi.

Hurmatli o'quvchilar! Python loyihalaringizda turdagi tekshiruvdan foydalanasizmi?

4 million satr Python kodini terishni tekshirish yo'li. 3-qism
4 million satr Python kodini terishni tekshirish yo'li. 3-qism

Manba: www.habr.com

a Izoh qo'shish