Jalur pikeun typechecking 4 juta garis kode Python. Bagian 3

Kami nampilkeun ka perhatian anjeun bagian katilu tina tarjamahan bahan ngeunaan jalur anu Dropbox nyandak nalika nerapkeun sistem mariksa tipe pikeun kode Python.

Jalur pikeun typechecking 4 juta garis kode Python. Bagian 3

→ Bagian saméméhna: mimitina и kadua

Ngahontal 4 juta baris kode diketik

Tantangan utama anu sanés (sareng masalah anu paling umum kadua diantara anu ditaliti sacara internal) nyaéta ningkatkeun jumlah kode anu katutupan ku cek jinis dina Dropbox. Kami parantos nyobian sababaraha pendekatan pikeun ngabéréskeun masalah ieu, tina sacara alami ngembang ukuran basis kode anu diketik pikeun museurkeun usaha tim mypy kana inferensi tipe otomatis statik sareng dinamis. Tungtungna, éta sigana kawas euweuh strategi unggul basajan, tapi kami bisa ngahontal tumuwuhna gancang dina volume kode annotated ku ngagabungkeun loba pendekatan.

Hasilna, gudang Python pangbadagna urang (kalawan kode backend) boga ampir 4 juta garis kode annotated. Pagawean ngetik kode statik parantos réngsé kirang langkung tilu taun. Mypy ayeuna ngadukung sababaraha jinis laporan sinyalna kode anu ngagampangkeun ngawas kamajuan ngetik. Khususna, urang tiasa ngahasilkeun laporan ngeunaan kode kalayan ambiguitas dina jinis, sapertos, contona, pamakean eksplisit tina hiji jinis. Any dina anotasi anu teu tiasa diverifikasi, atanapi sareng hal-hal sapertos ngimpor perpustakaan pihak katilu anu henteu ngagaduhan anotasi jinis. Salaku bagian tina proyék pikeun ningkatkeun akurasi pamariksaan jinis dina Dropbox, kami nyumbang kana ningkatkeun definisi jinis (disebut file rintisan) pikeun sababaraha perpustakaan open source populér dina gudang Python terpusat. ketik.

Urang dilaksanakeun (jeung standarisasi dina PEPs saterusna) fitur anyar tina sistem tipe nu ngidinan tipe leuwih tepat pikeun sababaraha pola Python husus. Hiji conto kasohor ieu TypeDict, nu nyadiakeun tipe keur JSON-kawas kamus nu boga set tetep konci string, unggal mibanda nilai tipe sorangan. Urang bakal neruskeun dilegakeun sistem tipe. Léngkah salajengna urang sigana bakal ningkatkeun dukungan pikeun kamampuan numerik Python.

Jalur pikeun typechecking 4 juta garis kode Python. Bagian 3
Jumlah garis kode annotated: server

Jalur pikeun typechecking 4 juta garis kode Python. Bagian 3
Jumlah garis kode annotated: klien

Jalur pikeun typechecking 4 juta garis kode Python. Bagian 3
Jumlah total baris kode annotated

Ieu tinjauan fitur utama tina hal-hal anu kami laksanakeun pikeun ningkatkeun jumlah kode annotated dina Dropbox:

Kakuatan anotasi. Urang laun ningkatkeun sarat pikeun rigor annotating kode anyar. Urang mimitian ku tips linter nu nyarankeun nambahkeun annotations kana file nu geus miboga sababaraha annotations. Urang ayeuna meryogikeun jinis anotasi dina file Python énggal sareng dina kalolobaan file anu tos aya.

Ngetik laporan. Kami ngirim laporan mingguan tim ngeunaan tingkat ngetik kodena sareng masihan naséhat ngeunaan naon anu kedah diémutan heula.

Popularisasi mypy. Urang ngobrol ngeunaan mypy dina acara sareng ngobrol sareng tim pikeun ngabantosan aranjeunna ngamimitian nganggo anotasi jinis.

Polling. Urang ngalaksanakeun survey pamaké periodik pikeun ngaidentipikasi masalah utama. Kami siap angkat jauh dina ngarengsekeun masalah ieu (malah nyiptakeun basa anyar pikeun nyepetkeun mypy!).

Performance. Kami parantos ningkatkeun pisan kinerja mypy ku ngagunakeun daemon sareng mypyc. Hal ieu dilakukeun pikeun ngalancarkeun kasulitan anu timbul nalika prosés anotasi, sareng supados tiasa damel sareng kode anu ageung.

Integrasi sareng éditor. Kami parantos ngawangun alat pikeun ngadukung ngajalankeun mypy dina éditor anu populer di Dropbox. Ieu kalebet PyCharm, Vim sareng VS Code. Ieu greatly disederhanakeun prosés annotating kode jeung mariksa pungsionalitasna. Jenis lampah ieu umum nalika annotating kode nu aya.

Analisis statik. Kami nyiptakeun alat pikeun nyimpulkeun tanda tangan fungsi nganggo alat analisis statik. Alat ieu ngan ukur tiasa dianggo dina kaayaan anu kawilang saderhana, tapi ngabantosan urang ningkatkeun cakupan jinis kode urang tanpa seueur usaha.

Rojongan pikeun perpustakaan pihak katilu. Seueur proyék kami nganggo toolkit SQLAlchemy. Butuh kauntungan tina kamampuan dinamis Python anu jinis PEP 484 henteu tiasa dimodelkeun langsung. Kami, saluyu sareng PEP 561, nyiptakeun file rintisan anu saluyu sareng nyerat plugin pikeun mypy (open source), anu ningkatkeun dukungan SQLAlchemy.

Kasesahan anu urang tempuh

Jalan ka 4 juta baris kode anu diketik henteu salawasna gampang pikeun urang. Dina jalur ieu kami ngalaman loba potholes sarta nyieun sababaraha kasalahan. Ieu sababaraha masalah anu kami hadapi. Kami ngarepkeun ngawartosan aranjeunna bakal ngabantosan batur ngahindarkeun masalah anu sami.

file leungit. Urang ngamimitian karya urang ku mariksa ngan jumlah leutik file. Naon waé anu henteu kalebet dina file ieu henteu dipariksa. Payil ditambahkeun kana daptar scanning nalika annotations munggaran nembongan dina eta. Upami aya anu diimpor tina modul anu aya di luar ruang lingkup verifikasi, maka urang nyarioskeun ngeunaan damel sareng nilai sapertos Any, nu teu diuji pisan. Ieu ngakibatkeun leungitna signifikan tina akurasi ketikan, utamana dina tahap awal migrasi. pendekatan ieu geus digawé héran ogé jadi jauh, sanajan kaayaan has nyaeta nambahkeun file kana wengkuan review nembongkeun masalah di bagian séjén codebase nu. Dina kasus anu paling parah, nalika dua daérah terasing kode dihijikeun, dimana, masing-masing, masing-masing, jinisna parantos dipariksa, tétéla yén jinis daérah ieu henteu cocog sareng anu sanés. Ieu nyababkeun kabutuhan pikeun seueur parobihan kana anotasi. Ningali deui ayeuna, urang sadar yén urang kedahna nambihan modul perpustakaan inti kana daérah pamariksaan tipe mypy langkung lami. Ieu bakal ngajantenkeun padamelan urang langkung tiasa diprediksi.

Annotating kode heubeul. Nalika urang ngamimitian, urang tadi ngeunaan 4 juta garis kode Python aya. Ieu jelas yén annotating sakabéh kode ieu teu hiji tugas gampang. Kami parantos nyiptakeun alat anu disebut PyAnnotate anu tiasa ngumpulkeun inpormasi jinis nalika tés dijalankeun sareng tiasa nambihan anotasi jinis kana kode anjeun dumasar kana inpormasi anu dikumpulkeun. Najan kitu, urang teu noticed a nyoko utamana nyebar tina alat ieu. Ngumpulkeun informasi tipe éta slow, sarta annotations dihasilkeun otomatis mindeng merlukeun loba éditan manual. Urang mikir ngeunaan otomatis ngajalankeun alat ieu unggal waktos urang marios kode, atawa ngeunaan ngumpulkeun informasi tipe dumasar kana analisis sababaraha volume leutik requests jaringan sabenerna, tapi mutuskeun moal sabab salah sahiji pendekatan teuing picilakaeun.

Hasilna, bisa dicatet yén lolobana kode ieu sacara manual annotated ku nu bogana. Pikeun nungtun prosés ieu ka arah anu leres, kami nyiapkeun laporan ngeunaan modul sareng fungsi anu penting anu kedah dijelaskeun. Contona, hal anu penting pikeun nyadiakeun tipe annotations pikeun modul perpustakaan anu dipaké dina ratusan tempat. Tapi hiji layanan heubeul nu keur diganti ku nu anyar geus euweuh jadi penting pikeun annotate. Kami ogé ékspérimén nganggo analisis statik pikeun ngahasilkeun anotasi jinis pikeun kode warisan.

Impor siklik. Di luhur, kuring ngobrol ngeunaan impor siklik ("katergantungan kusut"), ayana anu nyababkeun hésé pikeun nyepetkeun mypy. Urang ogé kedah kerja keras pikeun ngajantenkeun mypy ngadukung sagala jinis idiom anu disababkeun ku impor siklik ieu. Kami nembé réngsé proyék desain ulang sistem utama anu ngalereskeun seueur masalah mypy ngeunaan impor sirkular. Masalah ieu sabenerna stemmed ti poé pisan mimiti proyek, balik ti Alore, basa atikan yén proyék mypy asalna fokus kana. Sintaksis Alore ngagampangkeun pikeun ngajawab masalah sareng paréntah impor siklik. Mypy modéren parantos ngawariskeun sababaraha watesan ti palaksanaan anu saderhana sareng sederhana (anu cocog pikeun Alore). Python ngajadikeun gawé bareng impor sirkular hésé, utamana kusabab ekspresi anu ambigu. Contona, hiji operasi ngerjakeun sabenerna bisa nangtukeun jenis alias. Mypy henteu salawasna tiasa ngadeteksi hal-hal sapertos kieu dugi ka kalolobaan loop impor parantos diolah. Henteu aya ambiguitas sapertos kitu di Alore. Kaputusan goréng anu dilakukeun dina tahap awal pamekaran sistem tiasa nampilkeun kejutan anu teu pikaresepeun pikeun programmer mangtaun-taun ka hareup.

Hasilna: jalur ka 5 juta garis kode sareng cakrawala anyar

Proyék mypy parantos lami - ti mimiti prototipe dugi ka sistem anu ngatur 4 juta jalur jinis kode produksi. Nalika mypy mekar, petunjuk jinis Python distandarisasi. Poé ieu, ékosistem anu kuat parantos ngembangkeun nalika ngetik kode Python. Éta ngagaduhan tempat pikeun ngadukung perpustakaan, éta ngandung alat bantu pikeun IDE sareng éditor, éta ngagaduhan sababaraha sistem kontrol tipeu, anu masing-masing gaduh pro sareng kontra sorangan.

Sanaos pamariksaan jinis parantos dipasihkeun di Dropbox, kuring yakin urang masih dina awal ngetik kode Python. Jigana téknologi mariksa tipe bakal terus mekar jeung ningkatkeun.

Upami anjeun henteu acan nganggo mariksa jinis dina proyék Python skala ageung anjeun, teras terang yén ayeuna mangrupikeun waktos anu saé pikeun ngamimitian ngalih ka ngetik statik. Kuring geus ngobrol jeung jalma anu geus nyieun transisi sarupa. Euweuh nu kaduhung. Pamariksaan jinis ngajantenkeun Python janten basa anu langkung cocog pikeun ngembangkeun proyék ageung tibatan "Python biasa."

Pamiarsa Hadirin! Naha anjeun nganggo mariksa jinis dina proyék Python anjeun?

Jalur pikeun typechecking 4 juta garis kode Python. Bagian 3
Jalur pikeun typechecking 4 juta garis kode Python. Bagian 3

sumber: www.habr.com

Tambahkeun komentar