Path kanggo ngetik 4 yuta baris kode Python. Bagean 3

Kita menehi perhatian marang bagean katelu saka terjemahan materi babagan path sing ditindakake Dropbox nalika ngetrapake sistem mriksa jinis kode Python.

Path kanggo ngetik 4 yuta baris kode Python. Bagean 3

β†’ Bagean sadurunge: pisanan ΠΈ kapindho

Tekan 4 yuta baris kode sing diketik

Tantangan utama liyane (lan masalah sing paling umum nomer loro ing antarane sing ditliti sacara internal) yaiku nambah jumlah kode sing dilindhungi dening mriksa jinis ing Dropbox. Kita wis nyoba sawetara pendekatan kanggo ngatasi masalah iki, saka alamiah nambah ukuran codebase diketik kanggo ngarahke tim mypy efforts ing statis lan dinamis otomatis tipe inferensi. Ing pungkasan, katon kaya ora ana strategi menang sing prasaja, nanging kita bisa entuk wutah kanthi cepet ing volume kode anotasi kanthi nggabungake akeh pendekatan.

AkibatΓ©, repositori Python paling gedhΓ© (karo kode backend) wis meh 4 yuta baris kode annotated. Karya ngetik kode statis rampung kira-kira telung taun. Mypy saiki ndhukung macem-macem jinis laporan jangkoan kode sing luwih gampang kanggo ngawasi kemajuan ngetik. Utamane, kita bisa ngasilake laporan babagan kode kanthi ambiguitas ing jinis, kayata, contone, panggunaan eksplisit saka jinis. Any ing anotasi sing ora bisa diverifikasi, utawa kaya ngimpor perpustakaan pihak katelu sing ora duwe anotasi jinis. Minangka bagΓ©an saka proyek kanggo nambah akurasi mriksa jinis ing Dropbox, kita nyumbang kanggo nambah definisi jinis (sing diarani file rintisan) kanggo sawetara perpustakaan open source populer ing repositori Python terpusat. ketik.

We dipun ginakaken (lan standar ing PEPs sakteruse) fitur anyar saka sistem jinis sing ngidini jinis luwih tepat kanggo sawetara pola Python tartamtu. Conto sing misuwur yaiku TypeDict, sing nyedhiyakake jinis kamus kaya JSON sing duwe set kunci senar sing tetep, saben duwe nilai saka jinise dhewe. Kita bakal terus nggedhekake sistem jinis. Langkah sabanjure kita bakal nambah dhukungan kanggo kapabilitas numerik Python.

Path kanggo ngetik 4 yuta baris kode Python. Bagean 3
Jumlah baris kode anotasi: server

Path kanggo ngetik 4 yuta baris kode Python. Bagean 3
Jumlah baris kode anotasi: klien

Path kanggo ngetik 4 yuta baris kode Python. Bagean 3
Jumlah total baris kode anotasi

Mangkene ringkesan fitur utama babagan apa sing ditindakake kanggo nambah jumlah kode anotasi ing Dropbox:

Anotasi kaku. Kita mboko sithik nambah syarat kanggo kaku saka annotating kode anyar. Kita miwiti karo tips linter sing menehi saran kanggo nambah anotasi menyang file sing wis ana sawetara anotasi. Saiki kita mbutuhake anotasi jinis ing file Python anyar lan ing akeh file sing wis ana.

Ngetik laporan. Kita ngirim laporan mingguan tim babagan tingkat ngetik kode lan menehi saran babagan apa sing kudu dianotasi dhisik.

Popularisasi mypy. Kita ngomong babagan mypy ing acara lan ngobrol karo tim kanggo mbantu dheweke miwiti anotasi jinis.

Jajak pendapat. Kita nindakake survey pangguna periodik kanggo ngenali masalah utama. Kita siyap cukup adoh kanggo ngrampungake masalah kasebut (malah nggawe basa anyar kanggo nyepetake mypy!).

Kinerja. Kita wis ningkatake kinerja mypy kanthi nggunakake daemon lan mypyc. Iki ditindakake kanggo ngrampungake alangan sing kedadeyan sajrone proses anotasi, lan supaya bisa nggarap kode sing akeh.

Integrasi karo editor. Kita wis nggawe alat kanggo ndhukung mbukak mypy ing editors sing populer ing Dropbox. Iki kalebu PyCharm, Vim lan VS Code. Iki banget nyederhanakake proses anotasi kode lan mriksa fungsine. Jinis-jinis tumindak iki umum nalika menehi anotasi kode sing wis ana.

Analisis statis. Kita nggawe alat kanggo nyimpulake tandha fungsi nggunakake alat analisis statis. Alat iki mung bisa digunakake ing kahanan sing relatif prasaja, nanging mbantu kita nambah jangkoan jinis kode tanpa gaweyan akeh.

Dhukungan kanggo perpustakaan pihak katelu. Akeh proyek kita nggunakake toolkit SQLAlchemy. Iku njupuk kauntungan saka kemampuan dinamis Python sing PEP 484 jinis ora bisa model langsung. Kita, miturut PEP 561, nggawe file rintisan sing cocog lan nulis plugin kanggo mypy (mbukak sumber), sing nambah dhukungan SQLAlchemy.

Kesulitan sing kita temoni

Path menyang 4 yuta baris kode sing diketik ora mesthi gampang kanggo kita. Ing dalan iki kita nemoni akeh potholes lan nggawe sawetara kesalahan. Iki minangka sawetara masalah sing kita temoni. Kita ngarep-arep yen nyritakake babagan iki bakal mbantu wong liya ngindhari masalah sing padha.

File ilang. Kita miwiti karya kanthi mriksa mung sawetara file. Apa wae sing ora kalebu ing file kasebut ora dicenthang. File ditambahake menyang dhaptar mindhai nalika anotasi pisanan katon ing. Yen ana sing diimpor saka modul sing ana ing njaba ruang lingkup verifikasi, mula kita ngomong babagan nggarap nilai kaya Any, sing ora dites babar pisan. Iki nyebabake mundhut akurasi ngetik sing signifikan, utamane ing tahap awal migrasi. Pendekatan iki wis makarya kanthi apik nganti saiki, sanajan kahanan sing khas yaiku nambahake file menyang ruang lingkup review nuduhake masalah ing bagean liya saka basis kode. Ing kasus paling awon, nalika loro wilayah terisolasi saka kode digabungake, kang, independen saka saben liyane, jinis wis dicenthang, ternyata jinis wilayah iki padha ora kompatibel karo saben liyane. Iki nyebabake perlu kanggo nggawe akeh owah-owahan ing anotasi. Nggoleki saiki, kita ngerti manawa kita kudu nambah modul perpustakaan inti menyang area mriksa jinis mypy luwih cepet. Iki bakal nggawe karya kita luwih bisa ditebak.

Annotating kode lawas. Nalika kita miwiti, kita wis bab 4 yuta baris kode Python ana. Cetha yen menehi tandha kabeh kode iki dudu tugas sing gampang. Kita wis nggawe alat sing diarani PyAnnotate sing bisa ngumpulake informasi jinis nalika tes mlaku lan bisa nambah anotasi jinis menyang kode sampeyan adhedhasar informasi sing diklumpukake. Nanging, kita durung ngerteni panggunaan alat iki sing umum banget. Informasi jinis ngumpulake alon, lan anotasi sing digawe kanthi otomatis asring mbutuhake suntingan manual. Kita mikir babagan mbukak alat iki kanthi otomatis saben-saben mriksa kode, utawa ngumpulake informasi jinis adhedhasar nganalisa sawetara volume cilik panjaluk jaringan nyata, nanging mutusake ora amarga pendekatan kasebut uga beboyo.

Akibaté, bisa dicathet yèn akèh-akèhé kode kasebut diwènèhi anotasi kanthi manual déning sing duwé. Kanggo nuntun proses iki menyang arah sing bener, kita nyiapake laporan babagan modul lan fungsi sing penting banget sing kudu dianotasi. Contone, iku penting kanggo nyedhiyani jinis anotasi kanggo modul perpustakaan sing digunakake ing atusan panggonan. Nanging layanan lawas sing diganti karo sing anyar ora penting maneh kanggo menehi anotasi. Kita uga nyoba nggunakake analisis statis kanggo ngasilake anotasi jinis kanggo kode warisan.

Impor siklik. Ndhuwur, aku ngomong babagan impor siklik ("ketergantungan tangles"), anane sing nggawe angel nyepetake mypy. Kita uga kudu kerja keras supaya mypy ndhukung kabeh jinis idiom sing disebabake impor siklik kasebut. Kita bubar ngrampungake proyek desain ulang sistem utama sing ngrampungake masalah mypy babagan impor bunder. Masalah kasebut sejatine asale saka awal proyek kasebut, bali saka Alore, basa pendidikan sing dadi fokus proyek mypy. Sintaks Alore nggampangake ngatasi masalah karo printah ngimpor siklik. Mypy modern wis diwenehi sawetara watesan saka implementasine sing prasaja lan prasaja (sing cocog karo Alore). Python nggawe angel nggarap impor bunder, utamane amarga ekspresi ambigu. Contone, operasi assignment bener bisa nemtokake alias jinis. Mypy ora tansah bisa ndeteksi kaya iki nganti umume loop impor wis diproses. Ora ana ambiguitas ing Alore. Keputusan sing ora apik sing digawe ing tahap awal pangembangan sistem bisa menehi kejutan sing ora nyenengake kanggo programmer pirang-pirang taun sabanjure.

Asil: dalan menyang 5 yuta baris kode lan cakrawala anyar

Proyek mypy wis adoh banget - saka prototipe awal nganti sistem sing ngontrol 4 yuta baris jinis kode produksi. Nalika mypy ngalami Γ©volusi, pitunjuk jinis Python wis standar. Dina iki, ekosistem sing kuat wis dikembangake babagan ngetik kode Python. Nduwe papan kanggo dhukungan perpustakaan, ngemot alat bantu kanggo IDE lan editor, duwe sawetara sistem kontrol jinis, saben duwe pro lan kontra.

Sanajan mriksa jinis wis diwenehake ing Dropbox, aku yakin kita isih ana ing wiwitan ngetik kode Python. Aku mikir teknologi mriksa jinis bakal terus berkembang lan nambah.

Yen sampeyan durung nggunakake mriksa jinis ing proyek Python skala gedhe, mula ngerti yen saiki iki wektu sing apik kanggo miwiti transisi menyang ngetik statis. Aku wis ngomong karo wong-wong sing wis nggawe transisi sing padha. Ora ana sing getun. Priksa jinis nggawe Python dadi basa sing luwih cocog kanggo ngembangake proyek gedhe tinimbang "Python biasa."

Para pamaca ingkang kinurmatan! Apa sampeyan nggunakake mriksa jinis ing proyek Python sampeyan?

Path kanggo ngetik 4 yuta baris kode Python. Bagean 3
Path kanggo ngetik 4 yuta baris kode Python. Bagean 3

Source: www.habr.com

Add a comment