A strada per a verificazione di 4 milioni di linee di codice Python. Parte 3

Avemu prisentatu à a vostra attenzione a terza parte di a traduzzione di materiale nantu à a strada chì Dropbox hà pigliatu quandu implementava un sistema di cuntrollu di tipu per u codice Python.

A strada per a verificazione di 4 milioni di linee di codice Python. Parte 3

→ Parti precedenti: u primu и u sicondu

Raggiunge 4 milioni di linee di codice digitatu

Un'altra sfida maiò (è a seconda preoccupazione più cumuna trà quelli indagati internamente) era l'aumentu di a quantità di codice coperta da cuntrolli di tipu in Dropbox. Avemu pruvatu parechji approcci per risolve stu prublema, da a crescita naturale di a dimensione di a basa di codice digitatu à cuncentrazione di i sforzi di a squadra di mypy in inferenza statica è dinamica di tipu automatizatu. À a fine, pareva chì ùn ci era micca una strategia vincente simplice, ma avemu pussutu ottene una crescita rapida in u voluminu di codice annotatu cumminendu assai approcci.

In u risultatu, u nostru più grande repository Python (cù codice backend) hà quasi 4 milioni di linee di codice annotatu. U travagliu nantu à a tipografia di codice staticu hè statu finitu in circa trè anni. Mypy supporta avà diversi tipi di rapporti di copertura di codice chì facenu più faciule per monitorà u prugressu di scrittura. In particulare, pudemu generà rapporti nantu à u codice cù ambiguità in tipi, cum'è, per esempiu, l'usu esplicitu di un tipu. Any in annotations chì ùn ponu micca esse verificate, o cù cose cum'è impurtà biblioteche di terzu chì ùn anu micca annotazioni di tipu. Cum'è parte di un prughjettu per migliurà l'accuratezza di a verificazione di tipu in Dropbox, avemu cuntribuitu à migliurà e definizioni di tipu (i cosiddetti stub files) per alcune biblioteche open source populari in un repository Python centralizatu. digitatu.

Avemu implementatu (è standardizatu in i PEP successivi) novi funziunalità di u sistema di tipu chì permettenu tipi più precisi per certi mudelli Python specifichi. Un esempiu notable di questu hè TypeDict, chì furnisce tipi di dizziunari simili à JSON chì anu un settore fissu di chjavi di stringa, ognunu cù un valore di u so propiu tipu. Avemu da cuntinuà à espansione u sistema di tipu. U nostru prossimu passu serà prubabilmente di migliurà u supportu per e capacità numeriche di Python.

A strada per a verificazione di 4 milioni di linee di codice Python. Parte 3
Numaru di linii di codice annotatu: servitore

A strada per a verificazione di 4 milioni di linee di codice Python. Parte 3
Numaru di linii di codice annotatu: cliente

A strada per a verificazione di 4 milioni di linee di codice Python. Parte 3
Numaru tutale di linii di codice annotatu

Eccu una panoramica di e caratteristiche principali di e cose chì avemu fattu per aumentà a quantità di codice annotatu in Dropbox:

Rigurosità di l'annotazione. Aumentemu gradualmente i requisiti per u rigore di l'annotazione di u novu codice. Avemu cuminciatu cù cunsiglii di linter chì suggerenu di aghjunghje annotazioni à i schedari chì avianu digià alcune annotazioni. Avemu avà bisognu di annotazioni di tipu in novi schedarii Python è in a maiò parte di i fugliali esistenti.

Rapporti di scrittura. Mandemu e squadre rapporti settimanali nantu à u livellu di scrive in u so codice è dà cunsiglii nantu à ciò chì deve esse annotatu prima.

A popularizazione di mypy. Parlemu di mypy à l'avvenimenti è parlemu à e squadre per aiutà à inizià cù annotazioni di tipu.

Sondaggi. Facemu sondaggi periodichi di l'utilizatori per identificà i prublemi maiò. Semu pronti per andà abbastanza luntanu per risolve questi prublemi (ancu creendu una nova lingua per accelerà mypy !).

Prestazione. Avemu migliuratu assai u rendiment di mypy usendu u daemon è mypyc. Questu hè statu fattu per liscia l'inconveniences chì sorgianu durante u prucessu di annotazione, è per pudè travaglià cù una grande quantità di codice.

Integrazione cù editori. Avemu custruitu strumenti per sustene l'esecuzione di mypy in editori populari in Dropbox. Questu include PyCharm, Vim è VS Code. Questu hà simplificatu assai u prucessu di annotazione di u codice è cuntrollà a so funziunalità. Sti tipi d'azzioni sò cumuni quandu annotate u codice esistente.

Analisi statica. Avemu creatu un strumentu per inferisce e signature di funzioni utilizendu strumenti di analisi statica. Stu strumentu pò travaglià solu in situazioni relativamente sèmplice, ma ci hà aiutatu à aumentà a nostra cobertura di tipu di codice senza assai sforzu.

Supportu per biblioteche di terze parti. Parechji di i nostri prughjetti utilizanu u toolkit SQLAlchemy. Prufitta di e capacità dinamiche di Python chì i tipi PEP 484 ùn sò micca capaci di mudificà direttamente. Avemu, in cunfurmità cù PEP 561, creatu u stub file currispondente è hà scrittu un plugin per mypy (fonte aperta), chì migliurà u supportu SQLAlchemy.

Difficultà chì avemu scontru

A strada di 4 milioni di linee di codice digitatu ùn hè micca sempre stata faciule per noi. Nant'à stu chjassu avemu scontru assai buche è fattu parechji sbagli. Eccu alcuni di i prublemi chì avemu scontru. Speremu chì parlà di elli aiuterà l'altri à evità prublemi simili.

File mancanti. Avemu principiatu u nostru travagliu cuntrollà solu una piccula quantità di schedari. Tuttu ciò chì ùn hè micca inclusu in questi schedari ùn hè micca verificatu. I schedari sò stati aghjuntu à a lista di scanning quandu i primi annotazioni apparsu in elli. Se qualcosa hè stata impurtata da un modulu situatu fora di u scopu di verificazione, allora avemu parlatu di travaglià cù valori cum'è Any, chì ùn sò micca stati pruvati in tuttu. Questu hà purtatu à una perdita significativa di precisione di scrittura, soprattuttu in i primi fasi di migrazione. Stu approcciu hà travagliatu sorprendentemente bè finu à quì, ancu s'è una situazione tipica hè chì l'aghjunghje i schedari à u scopu di a rivista palesa prublemi in altre parti di u codice. In u peghju casu, quandu dui zoni isolati di codice sò stati fusionati, in quale, indipindentamente l'una di l'altru, i tipi sò digià verificati, hè risultatu chì i tipi di sti spazii eranu incompatibili cù l'altri. Questu hà purtatu à a necessità di fà parechji cambiamenti à l'annotazioni. Fighjendu avà, avemu capitu chì duvemu avè aghjustatu moduli di libreria core à l'area di cuntrollu di tipu di mypy prima. Questu faria u nostru travagliu assai più prevedibile.

Annotazione di codice anticu. Quandu avemu principiatu, avemu avutu circa 4 milioni di linee di codice Python esistenti. Era chjaru chì annotà tuttu stu codice ùn era micca un compitu faciule. Avemu creatu un strumentu chjamatu PyAnnotate chì pò cullà l'infurmazioni di tipu cum'è e teste correnu è ponu aghjunghje annotazioni di tipu à u vostru codice basatu annantu à l'infurmazioni raccolte. Tuttavia, ùn avemu micca nutatu una adopzione particularmente diffusa di stu strumentu. A raccolta di informazioni di tippu era lenta, è l'annotazioni generate automaticamente necessitavanu spessu parechje editi manuali. Avemu pensatu à curriri stu strumentu in autumàticu ogni volta avemu rivista codice, o cullizzioni di infurmazione tippu basatu nantu à analizà qualchi picculu vulume di dumanda rete attuale, ma dicisi micca à perchè sia avvicinamentu era troppu risicatu.

In u risultatu, pò esse nutatu chì a maiò parte di u codice hè stata annotata manualmente da i so patroni. Per guidà stu prucessu in a direzione ghjusta, avemu preparatu rapporti nantu à moduli è funzioni particularmente impurtanti chì anu da esse annotati. Per esempiu, hè impurtante furnisce annotazioni di tipu per un modulu di biblioteca chì hè utilizatu in centinaie di posti. Ma un vechju serviziu chì hè rimpiazzatu cù un novu ùn hè più cusì impurtante per annotà. Avemu ancu esperimentu cù l'usu di l'analisi statica per generà annotazioni di tipu per u codice legatu.

Importazioni cicliche. Sopra, aghju parlatu di l'impurtazioni ciclichi (i "tangles di dipendenza"), l'esistenza di quale hà fattu difficiule di accelerà mypy. Avemu ancu avutu à travaglià dura per fà chì mypy sustene ogni tipu d'idiomi chì sò causati da queste impurtazioni cicliche. Recentemente avemu finitu un grande prughjettu di riprogettazione di u sistema chì risolve a maiò parte di i prublemi di mypy in quantu à l'impurtazioni circulari. Sti prublemi sò in realtà ghjunti da i primi tempi di u prugettu, di ritornu da Alore, a lingua educativa chì u prughjettu mypy era inizialmente focu annantu. A sintassi d'Alore facilita a risolve i prublemi cù cumandamenti d'importazione ciclicu. Mypy mudernu hà ereditatu alcune limitazioni da a so implementazione di mente simplice (chì era una grande adatta per Alore). Python rende u travagliu cù l'impurtazioni circulari difficili, principalmente perchè l'espressioni sò ambigue. Per esempiu, una operazione di assignazione pò veramente definisce un alias di tipu. Mypy ùn hè micca sempre capace di detectà cose cusì finu à chì a maiò parte di u ciclu d'importazione hè stata trattata. Ùn ci era micca tali ambiguità in Alore. Poveri decisioni fatti in i primi fasi di u sviluppu di u sistema ponu presentà una sorpresa dispiacevule à u programatore parechji anni dopu.

Risultati: a strada di 5 milioni di linee di codice è novi orizonti

U prughjettu mypy hà fattu una longa strada - da i primi prototipi à un sistema chì cuntrolla 4 milioni di linee di tipi di codice di produzzione. Cum'è mypy hà evolutu, i suggerimenti di u tipu di Python sò stati standardizati. In questi ghjorni, un ecosistema putente hà sviluppatu intornu à scrive u codice Python. Havi un locu per u supportu di a biblioteca, cuntene l'arnesi ausiliari per l'IDE è l'editori, hà parechji sistemi di cuntrollu di tipu, ognuna di quale hà i so pros è cuns.

Ancu s'è a verificazione di u tipu hè digià datu à Dropbox, crede chì simu sempre in i primi tempi di scrive u codice Python. Pensu chì e tecnulugii di cuntrollu di u tipu continuanu à evoluzione è à migliurà.

Se ùn avete micca digià utilizatu a verificazione di tipu in u vostru prughjettu di Python à grande scala, allora sapete chì avà hè un bonu tempu per cumincià à passà à a scrittura statica. Aghju parlatu à quelli chì anu fattu una transizione simili. Nisunu di elli si dispiaceva. A verificazione di u tipu face Python una lingua chì hè assai più adattata per sviluppà grandi prughjetti chè "Python normale".

Beni, lettori! Aduprate a verificazione di tipu in i vostri prughjetti Python?

A strada per a verificazione di 4 milioni di linee di codice Python. Parte 3
A strada per a verificazione di 4 milioni di linee di codice Python. Parte 3

Source: www.habr.com

Add a comment