{"id":38649,"date":"2019-10-31T22:25:04","date_gmt":"2019-10-31T19:25:04","guid":{"rendered":"https:\/\/prohoster.info\/blog\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-3\/"},"modified":"2019-10-31T22:25:04","modified_gmt":"2019-10-31T19:25:04","slug":"put-k-proverke-tipov-4-millionov-strok-python-koda-chast-3","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-3","title":{"rendered":"Il percorso per la verifica dei tipi di 4 milioni di righe di codice Python. Parte 3","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Presentiamo la terza parte della traduzione del materiale sul percorso intrapreso dall'azienda Dropbox nell'implementare un sistema di verifica dei tipi di codice Python.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/468237\/\"><img decoding=\"async\" alt=\"Il percorso per la verifica dei tipi di 4 milioni di righe di codice Python. Parte 3\" src=\"\/wp-content\/uploads\/2019\/10\/757669265e870de604388c66adef814d.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>\u2192 Parti precedenti: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/468233\/\">prima<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/468235\/\">seconda<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Raggiungere 4 milioni di righe di codice tipizzato<\/h2>\n<p>\nUn'altra importante sfida (questa era la seconda preoccupazione pi\u00f9 comune emersa nei sondaggi interni) era aumentare il volume di codice in Dropbox coperto da verifiche sui tipi. Abbiamo provato diversi approcci per affrontare questa sfida, dalla crescita naturale della base di codice tipizzata alla focalizzazione degli sforzi del team mypy sulla deduzione statica e dinamica dei tipi. Alla fine, \u00e8 emerso che non esiste una semplice strategia vincente, ma siamo riusciti a ottenere una rapida crescita del volume di codice annotato, combinando diversi approcci.<\/p>\n<p>Come risultato, nel nostro pi\u00f9 grande repository Python (con codice backend), il numero di righe di codice annotato ha raggiunto quasi 4 milioni. Il lavoro sulla tipizzazione statica del codice \u00e8 stato svolto in circa tre anni. Mypy ora supporta diversi tipi di report sulla copertura del codice da parte dei tipi, facilitando il monitoraggio del progresso della tipizzazione. In particolare, possiamo generare report sul codice con incertezze nei tipi, come ad esempio l'uso esplicito del tipo <code>Any<\/code> nelle annotazioni, che non possono essere verificate, o come quelle riguardanti l'importazione di librerie di terze parti, che non hanno annotazioni di tipo. Nell'ambito del progetto per migliorare la precisione della verifica dei tipi in Dropbox, abbiamo contribuito a migliorare le definizioni dei tipi (i cosiddetti file stub) per alcune librerie open source popolari nel repository Python centralizzato <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/python\/typeshed\">typeshed<\/a><\/noindex>.<\/p>\n<p>Abbiamo implementato (e standardizzato nei successivi PEP) nuove funzionalit\u00e0 del sistema dei tipi, che consentono l'uso di tipi pi\u00f9 precisi per alcuni schemi specifici di Python. Un esempio notevole di questo \u00e8 <code>TypeDict<\/code>, che fornisce tipi per dizionari simili a JSON con un insieme fisso di chiavi stringa, ognuna delle quali ha un proprio tipo di valore. Continueremo a espandere il sistema di tipi. Probabilmente, il nostro prossimo passo sar\u00e0 migliorare il supporto delle funzionalit\u00e0 di Python per la gestione dei numeri.<\/p>\n<p><img decoding=\"async\" alt=\"Il percorso per la verifica dei tipi di 4 milioni di righe di codice Python. Parte 3\" src=\"\/wp-content\/uploads\/2019\/10\/297b9e823141d6cb0d2f19f9a78a1153.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Numero di righe di codice annotato: server<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Il percorso per la verifica dei tipi di 4 milioni di righe di codice Python. Parte 3\" src=\"\/wp-content\/uploads\/2019\/10\/c183a9227e51d847bfdb2b8f6153684f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Numero di righe di codice annotato: client<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Il percorso per la verifica dei tipi di 4 milioni di righe di codice Python. Parte 3\" src=\"\/wp-content\/uploads\/2019\/10\/0a8b936fa454a34c09a9c6a2694485c9.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Totale delle righe di codice annotato<\/i><\/p>\n<p>Ecco una panoramica delle principali caratteristiche delle azioni che abbiamo intrapreso per aumentare il volume di codice annotato in Dropbox:<\/p>\n<p>Rigorosit\u00e0 dell'annotazione. Abbiamo gradualmente aumentato i requisiti per la rigorosit\u00e0 dell'annotazione del nuovo codice. Abbiamo iniziato con suggerimenti del linter, che raccomandava di aggiungere annotazioni nei file gi\u00e0 annotati. Ora richiediamo annotazioni di tipo in nuovi file Python e nella maggior parte dei file esistenti.<\/p>\n<p>Rapporti di tipizzazione. Inviamo settimanalmente rapporti ai team riguardo al livello di tipizzazione del loro codice e forniamo suggerimenti su cosa sia meglio annotare per primo.<\/p>\n<p>Promozione di mypy. Parliamo di mypy in diversi eventi e collaboriamo con i team per aiutarli a iniziare a usare le annotazioni dei tipi.<\/p>\n<p>Sondaggi. Conduciamo sondaggi periodici tra gli utenti per identificare i principali problemi. Siamo pronti ad andare fino in fondo per risolvere queste questioni (fino a creare un nuovo linguaggio per accelerare mypy!).<\/p>\n<p>Prestazioni. Abbiamo notevolmente migliorato le prestazioni di mypy grazie all'uso del demone e di mypyc. Questo \u00e8 stato fatto per alleviare le difficolt\u00e0 durante il processo di annotazione e per consentire di lavorare con grandi volumi di codice.<\/p>\n<p>Integrazione con gli editor. Abbiamo sviluppato strumenti per supportare l'esecuzione di mypy negli editor pi\u00f9 popolari in Dropbox. Questi includono PyCharm, Vim e VS Code. Ci\u00f2 ha semplificato notevolmente il processo di annotazione del codice e di verifica della sua funzionalit\u00e0. Queste azioni sono tipicamente necessarie quando si annota codice esistente.<\/p>\n<p>Analisi statica. Abbiamo creato uno strumento per l'estrazione delle firme delle funzioni utilizzando metodologie di analisi statica. Questo strumento pu\u00f2 funzionare solo in situazioni relativamente semplici, ma ci ha aiutato a incrementare senza sforzi significativi la copertura del codice con i tipi.<\/p>\n<p>Supporto per librerie di terze parti. In molti dei nostri progetti utilizziamo il framework SQLAlchemy. Esso sfrutta le capacit\u00e0 dinamiche di Python, che i tipi definiti da PEP 484 non sono in grado di modellare direttamente. Abbiamo creato un file stub corrispondente e scritto un plugin per mypy (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dropbox\/sqlalchemy-stubs\">open source<\/a><\/noindex>), che migliora il supporto per SQLAlchemy.<\/p>\n<h2>Le difficolt\u00e0 che abbiamo incontrato<\/h2>\n<p>\nIl percorso verso 4 milioni di righe di codice tipizzato non \u00e8 stato sempre facile. Lungo la strada abbiamo incontrato diversi ostacoli e commesso vari errori. Ecco alcuni dei problemi che abbiamo affrontato. Speriamo che la nostra esperienza aiuti altri a evitare simili problematiche.<\/p>\n<p>File mancanti. Abbiamo iniziato il lavoro controllando solo un piccolo volume di file. Tutto ci\u00f2 che non rientrava in questo numero di file non \u00e8 stato verificato. I file venivano aggiunti all'elenco di controllo quando venivano annotate per la prima volta. Se qualcosa veniva importato da un modulo situato al di fuori dell'area di controllo, si trattava di lavorare con valori di tipo <code>Any<\/code>, che non sono mai stati controllati. Ci\u00f2 ha portato a una significativa perdita di accuratezza nel tipo, specialmente nelle prime fasi della migrazione. Questo approccio ha comunque funzionato sorprendentemente bene, sebbene fosse tipica la situazione in cui l'aggiunta di file nell'area di controllo rivelava problemi in altre parti della base di codice. Nella situazione peggiore, quando due aree di codice isolate, in cui i tipi erano gi\u00e0 stati verificati in modo indipendente, venivano unite, si scopriva che i tipi di queste aree erano incompatibili tra loro. Questo ha comportato la necessit\u00e0 di apportare numerose modifiche alle annotazioni. Ora, guardando indietro, comprendiamo che avremmo dovuto includere il modulo di libreria di base nell'area di controllo dei tipi mypy il prima possibile. Questo avrebbe reso il nostro lavoro molto pi\u00f9 prevedibile.<\/p>\n<p>Annotazione del vecchio codice. Quando abbiamo iniziato a lavorare, avevamo circa 4 milioni di righe di codice Python gi\u00e0 esistente. Era chiaro che annotare tutto questo codice era un compito non facile. Abbiamo creato uno strumento chiamato PyAnnotate, che pu\u00f2 raccogliere informazioni sui tipi durante l'esecuzione dei test e aggiungere al codice annotazioni di tipo basate sui dati raccolti. Tuttavia, non abbiamo notato un'adozione particolarmente ampia di questo strumento. La raccolta delle informazioni sui tipi era lenta, e le annotazioni generate automaticamente richiedevano spesso molte modifiche manuali. Abbiamo pensato di eseguire automaticamente questo strumento ad ogni controllo del codice, o di raccogliere informazioni sui tipi basate sull'analisi di un certo volume di richieste di rete reali, ma abbiamo deciso di non farlo, poich\u00e9 entrambi questi approcci erano troppo rischiosi.<\/p>\n<p>In conclusione, si pu\u00f2 notare che la maggior parte del codice \u00e8 stata annotata manualmente dai suoi proprietari. Noi, per orientare questo processo nella giusta direzione, prepariamo report sui moduli e sulle funzionalit\u00e0 particolarmente importanti da annotare. Ad esempio, \u00e8 fondamentale fornire annotazioni sui tipi per un modulo di libreria utilizzato in centinaia di punti. Tuttavia, per un vecchio servizio che viene sostituito da uno nuovo, annotare non \u00e8 cos\u00ec importante. Inoltre, stiamo sperimentando l'uso dell'analisi statica per generare annotazioni dei tipi per codice obsoleto.<\/p>\n<p>Importazioni cicliche. Ho gi\u00e0 parlato delle importazioni cicliche (dei \"nodi di dipendenza\"), la cui esistenza ha complicato il potenziamento di mypy. Inoltre, abbiamo dovuto lavorare duramente per fornire a mypy supporto per tutti i tipi di idiomi, che sono stati causati da queste importazioni cicliche. Di recente abbiamo completato un grande progetto di redesign del sistema, che ha risolto la maggior parte dei problemi di mypy riguardanti le importazioni cicliche. Questi problemi, infatti, risalivano ai primi giorni del progetto, all'epoca di Alore, il linguaggio didattico su cui era inizialmente basato il progetto mypy. La sintassi di Alore consente di gestire facilmente i problemi delle importazioni cicliche. L'attuale mypy ha ereditato alcune limitazioni dalla sua prima implementazione semplice (che andava bene per Alore). Python complica il lavoro con le importazioni cicliche principalmente a causa dell'ambiguit\u00e0 delle espressioni. Ad esempio, durante un'operazione di assegnazione di valori, potrebbe effettivamente essere definito un alias di tipo. Mypy non \u00e8 sempre in grado di rilevare tali situazioni finch\u00e9 gran parte del ciclo di importazione non \u00e8 stata elaborata. In Alore non c'erano ambiguit\u00e0 di questo tipo. Decisioni sbagliate prese nelle prime fasi dello sviluppo del sistema possono riservare brutte sorprese ai programmatori molti anni dopo.<\/p>\n<h2>Risultati: un cammino verso 5 milioni di righe di codice e nuovi orizzonti<\/h2>\n<p>\nIl progetto mypy ha fatto molta strada: da prototipi iniziali a un sistema che controlla i tipi di codice di produzione per un totale di 4 milioni di righe. Durante lo sviluppo, mypy ha standardizzato le annotazioni di tipo in Python. Oggi, attorno alla tipizzazione del codice Python, si \u00e8 sviluppato un ecosistema robusto. Questo ecosistema include supporto per librerie, strumenti per IDE e editor, e diverse sistemi di controllo dei tipi, ognuna con i propri vantaggi e svantaggi.<\/p>\n<p>Sebbene il controllo dei tipi sia ormai considerato una prassi consolidata in Dropbox, sono convinto che siamo ancora all'alba della tipizzazione del codice Python. Credo che le tecnologie di controllo dei tipi continueranno a evolversi e migliorare.<\/p>\n<p>Se non hai ancora utilizzato i controlli dei tipi nel tuo progetto Python su larga scala, \u00e8 proprio il momento giusto per iniziare la transizione verso la tipizzazione statica. Ho parlato con persone che hanno effettuato questa transizione. Nessuno di loro se n'\u00e8 pentito. Il controllo dei tipi trasforma Python in un linguaggio decisamente pi\u00f9 adatto allo sviluppo di grandi progetti rispetto al \"normale Python\".<\/p>\n<p><b>Gentili lettori!<\/b> Utilizzi il controllo dei tipi nei tuoi progetti Python?<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/ruvds.com\/vps_start\/\"><img decoding=\"async\" alt=\"Il percorso per la verifica dei tipi di 4 milioni di righe di codice Python. Parte 3\" src=\"\/wp-content\/uploads\/2019\/10\/bf2bc557ce4481dd87398515bff60e3f.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/ruvds.com\/ru-rub\/#order\"><img decoding=\"async\" alt=\"Il percorso per la verifica dei tipi di 4 milioni di righe di codice Python. Parte 3\" src=\"\/wp-content\/uploads\/2019\/10\/098d481c25b3afaba9534c686e8f943a.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/468237\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0442\u0440\u0435\u0442\u044c\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043f\u0443\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0448\u043b\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Dropbox, \u0432\u043d\u0435\u0434\u0440\u044f\u044f \u0443 \u0441\u0435\u0431\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 Python-\u043a\u043e\u0434\u0430. \u2192 \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0447\u0430\u0441\u0442\u0438: \u043f\u0435\u0440\u0432\u0430\u044f \u0438 \u0432\u0442\u043e\u0440\u0430\u044f \u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435 4 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0415\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 (\u044d\u0442\u043e \u0431\u044b\u043b \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0432\u043e\u043b\u043d\u043e\u0432\u0430\u0432\u0448\u0430\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043e\u043f\u0440\u043e\u0441\u0430\u0445) \u0431\u044b\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0451\u043c\u0430 \u043a\u043e\u0434\u0430 \u0432 Dropbox, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28992,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-38649","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0442\u0440\u0435\u0442\u044c\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043f\u0443\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0448\u043b\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Dropbox, \u0432\u043d\u0435\u0434\u0440\u044f\u044f \u0443 \u0441\u0435\u0431\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 Python-\u043a\u043e\u0434\u0430. \u2192 \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0447\u0430\u0441\u0442\u0438: \u043f\u0435\u0440\u0432\u0430\u044f \u0438 \u0432\u0442\u043e\u0440\u0430\u044f \u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435 4 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0415\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 (\u044d\u0442\u043e \u0431\u044b\u043b \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0432\u043e\u043b\u043d\u043e\u0432\u0430\u0432\u0448\u0430\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043e\u043f\u0440\u043e\u0441\u0430\u0445) \u0431\u044b\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0451\u043c\u0430 \u043a\u043e\u0434\u0430 \u0432 Dropbox,\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-3\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0443\u0442\u044c \u043a \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0442\u0438\u043f\u043e\u0432 4 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a Python-\u043a\u043e\u0434\u0430. \u0427\u0430\u0441\u0442\u044c 3 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0442\u0440\u0435\u0442\u044c\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043f\u0443\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0448\u043b\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Dropbox, \u0432\u043d\u0435\u0434\u0440\u044f\u044f \u0443 \u0441\u0435\u0431\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 Python-\u043a\u043e\u0434\u0430. \u2192 \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0447\u0430\u0441\u0442\u0438: \u043f\u0435\u0440\u0432\u0430\u044f \u0438 \u0432\u0442\u043e\u0440\u0430\u044f \u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435 4 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0415\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 (\u044d\u0442\u043e \u0431\u044b\u043b \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0432\u043e\u043b\u043d\u043e\u0432\u0430\u0432\u0448\u0430\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043e\u043f\u0440\u043e\u0441\u0430\u0445) \u0431\u044b\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0451\u043c\u0430 \u043a\u043e\u0434\u0430 \u0432 Dropbox,\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-3\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:25:04+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:25:04+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Il percorso verso il controllo dei tipi: 4 milioni di righe di codice Python. Parte 3 | ProHoster","description":"Ti presentiamo la terza parte della traduzione del materiale sul percorso che ha seguito Dropbox nell'implementare un sistema di controllo dei tipi del codice Python. \u2192 Parti precedenti: prima e seconda. Raggiungere 4 milioni di righe di codice tipizzato. Un'altra importante sfida (che \u00e8 stata la seconda questione pi\u00f9 popolare, secondo i sondaggi interni) era l'aumento del volume di codice in Dropbox.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-3","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0443\u0442\u044c \u043a \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0442\u0438\u043f\u043e\u0432 4 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a Python-\u043a\u043e\u0434\u0430. \u0427\u0430\u0441\u0442\u044c 3 | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0442\u0440\u0435\u0442\u044c\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043f\u0443\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0448\u043b\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Dropbox, \u0432\u043d\u0435\u0434\u0440\u044f\u044f \u0443 \u0441\u0435\u0431\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 Python-\u043a\u043e\u0434\u0430. \u2192 \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0447\u0430\u0441\u0442\u0438: \u043f\u0435\u0440\u0432\u0430\u044f \u0438 \u0432\u0442\u043e\u0440\u0430\u044f \u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435 4 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0415\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 (\u044d\u0442\u043e \u0431\u044b\u043b \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0432\u043e\u043b\u043d\u043e\u0432\u0430\u0432\u0448\u0430\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043e\u043f\u0440\u043e\u0441\u0430\u0445) \u0431\u044b\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0451\u043c\u0430 \u043a\u043e\u0434\u0430 \u0432 Dropbox,","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-3","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:25:04+00:00","article:modified_time":"2019-10-31T19:25:04+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"38649","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 22:54:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:05:23","updated":"2026-01-23 22:54:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/38649","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=38649"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/38649\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/28992"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=38649"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=38649"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=38649"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}