{"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>Vi presentiamo la terza parte della traduzione del materiale sul percorso compiuto dall'azienda Dropbox nell'implementazione di un sistema di verifica dei tipi per il 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\/\">il primo<\/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 (questo \u00e8 stato il secondo problema pi\u00f9 segnalato durante i sondaggi interni) era aumentare la quantit\u00e0 di codice in Dropbox coperto da controlli di tipo. Abbiamo sperimentato diversi approcci per affrontare questo problema, dalla crescita naturale della base di codice tipizzata alla concentrazione degli sforzi del team mypy su inferenze di tipo statiche e dinamiche automatizzate. Alla fine, \u00e8 emerso che non esisteva una strategia vincente semplice, ma siamo riusciti a ottenere una rapida crescita del codice annotato, combinando numerosi approcci.<\/p>\n<p>Di conseguenza, nel nostro pi\u00f9 grande repository Python (con codice backend), il numero di righe di codice annotato ha raggiunto quasi 4 milioni. Il lavoro di tipizzazione statica del codice \u00e8 stato svolto in circa tre anni. Mypy ora supporta diversi tipi di report sulla copertura del codice di tipo, che semplificano il monitoraggio del processo di tipizzazione. In particolare, possiamo generare report sul codice con incertezze nei tipi, come ad esempio l'uso esplicito di un tipo <code>Any<\/code> nelle annotazioni, che non possono essere verificate, o come l'importazione di librerie esterne 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 di tipo (i cosiddetti file stub) per alcune popolari librerie open source 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 di tipi che consentono di utilizzare tipi pi\u00f9 precisi per alcuni modelli specifici di Python. Un esempio notevole di ci\u00f2 \u00e8 <code>TypeDict<\/code>, che fornisce tipi per dizionari simili a JSON che hanno un insieme fisso di chiavi stabili, ciascuna delle quali ha un valore del proprio tipo. Continueremo a espandere il sistema di tipi. Probabilmente, il nostro prossimo passo sar\u00e0 migliorare il supporto delle funzionalit\u00e0 di Python per lavorare con i 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: cliente<\/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>Numero totale di 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>Rigidit\u00e0 dell'annotazione. Abbiamo gradualmente aumentato i requisiti di rigore per l'annotazione del nuovo codice. Abbiamo iniziato con i suggerimenti del linter, che raccomandavano di aggiungere annotazioni nei file che gi\u00e0 contenevano alcune annotazioni. Ora richiediamo la presenza di annotazioni sui tipi nei nuovi file Python e nella maggior parte dei file esistenti.<\/p>\n<p>Report sulla tipizzazione. Inviamo settimanalmente report ai team sul livello di tipizzazione del loro codice e forniamo suggerimenti su cosa dovrebbe essere annotato per primo.<\/p>\n<p>Promozione di mypy. Parliamo di mypy in vari eventi e ci confrontiamo con i team, aiutandoli a iniziare ad utilizzare le annotazioni sui tipi.<\/p>\n<p>Sondaggi. Eseguiamo sondaggi periodici tra gli utenti per identificare i principali problemi. Siamo pronti a spingerci abbastanza in l\u00e0 nella risoluzione di questi problemi (fino a creare un nuovo linguaggio per accelerare mypy!).<\/p>\n<p>Prestazioni. Abbiamo notevolmente migliorato le prestazioni di mypy grazie all'uso di un demone e di mypyc. Questo \u00e8 stato fatto per rendere pi\u00f9 fluido il processo di annotazione e per poter lavorare con grandi volumi di codice.<\/p>\n<p>Integrazione con gli editor. Abbiamo creato strumenti di supporto per eseguire mypy negli editor pi\u00f9 popolari in Dropbox. Questi includono PyCharm, Vim e VS Code. Questo ha notevolmente semplificato il processo di annotazione del codice e di verifica del suo funzionamento. Azioni simili sono comuni quando si annota il codice esistente.<\/p>\n<p>Analisi statica. Abbiamo creato uno strumento per generare le firme delle funzioni utilizzando strumenti di analisi statica. Questo strumento pu\u00f2 funzionare solo in situazioni relativamente semplici, ma ci ha aiutato ad aumentare senza sforzo la copertura del codice con i tipi.<\/p>\n<p>Supporto per librerie di terze parti. In molti dei nostri progetti utilizziamo il set di strumenti SQLAlchemy. Questo usa le capacit\u00e0 dinamiche di Python che i tipi PEP 484 non possono modellare direttamente. In conformit\u00e0 con il PEP 561, 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>), migliorando 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 sempre stato facile. Lungo questo cammino abbiamo incontrato molte insidie e commesso alcuni errori. Ecco alcuni dei problemi che abbiamo affrontato. Speriamo che raccontarli possa aiutare altri a evitare simili problematiche.<\/p>\n<p>File mancanti. Abbiamo iniziato a lavorare controllando solo un piccolo numero di file. Tutto ci\u00f2 che non era incluso in questo numero non veniva controllato. I file venivano aggiunti alla lista di controllo quando comparivano le prime annotazioni. Se si importava da un modulo situato al di fuori dell'area di controllo, si trattava di lavorare con valori di tipo <code>Any<\/code>, che non venivano affatto controllati. Questo ha portato a una significativa perdita di accuratezza nella tipizzazione, specialmente nelle prime fasi della migrazione. Questo approccio ha funzionato sorprendentemente bene, anche se la situazione tipica era che l'aggiunta di file all'area di controllo rivelava problemi in altre parti della base di codice. Nel peggior dei casi, quando si univano due aree di codice isolate, in cui i tipi erano gi\u00e0 stati controllati in modo indipendente, si scopriva che i tipi di queste aree erano incompatibili tra loro. Questo richiedeva modifiche significative nelle annotazioni. Ora, guardando indietro, ci rendiamo conto che avremmo dovuto aggiungere il modulo di base delle librerie all'area di controllo dei tipi mypy il prima possibile. Questo avrebbe reso il nostro lavoro molto pi\u00f9 prevedibile.<\/p>\n<p>Annotazione del codice vecchio. Quando abbiamo iniziato a lavorare, avevamo circa 4 milioni di righe di codice Python gi\u00e0 esistente. Era chiaro che annotare tutto questo codice sarebbe stata un'impresa non facile. Abbiamo creato uno strumento chiamato PyAnnotate, che pu\u00f2 raccogliere informazioni sui tipi durante l'esecuzione dei test e aggiungere annotazioni di tipo al codice, in base alle informazioni raccolte. Tuttavia, non abbiamo notato una diffusione particolarmente ampia di questo strumento. La raccolta delle informazioni sui tipi era lenta e le annotazioni generate automaticamente richiedevano spesso molte correzioni manuali. Abbiamo pensato di eseguire automaticamente questo strumento ad ogni revisione del codice o di raccogliere informazioni sui tipi, basandoci sull'analisi di un certo volume di richieste reali, ma abbiamo deciso di non farlo, poich\u00e9 ciascuno di questi approcci era troppo rischioso.<\/p>\n<p>In definitiva, si pu\u00f2 osservare che la maggior parte del codice \u00e8 stata annotata manualmente dai suoi proprietari. Per indirizzare questo processo nella giusta direzione, prepariamo report su moduli e funzioni particolarmente importanti da annotare. Ad esempio, \u00e8 importante fornire annotazioni di tipo per il modulo di libreria utilizzato in centinaia di posti. D'altra parte, non \u00e8 cos\u00ec importante annotare un vecchio servizio che viene sostituito da uno nuovo. Inoltre, stiamo sperimentando l'uso dell'analisi statica per generare annotazioni di tipo per il codice vecchio.<\/p>\n<p>Importazioni cicliche. Ho parlato in precedenza delle importazioni cicliche (dei \"nodi di dipendenze\"), la cui esistenza ha complicato l'accelerazione di mypy. Inoltre, abbiamo dovuto lavorare intensamente per fornire a mypy supporto per tutti i tipi di idiomi, la cui origine \u00e8 dovuta a queste importazioni cicliche. Recentemente abbiamo completato un grande progetto di redesign del sistema, che ha risolto la maggior parte dei problemi di mypy relativi alle importazioni cicliche. Questi problemi, in effetti, risalivano ai tempi molto precoci del progetto, sin dai tempi di Alore, il linguaggio educativo a cui il progetto mypy era inizialmente rivolto. La sintassi di Alore consente di risolvere facilmente i problemi delle catene cicliche di importazione. L'attuale mypy ha ereditato alcune limitazioni dalla sua prima implementazione semplice (che era perfettamente adeguata per Alore). Python complica la gestione delle importazioni cicliche principalmente a causa dell'ambiguit\u00e0 delle espressioni. Ad esempio, durante un'operazione di assegnazione, un alias di tipo pu\u00f2 effettivamente essere determinato. Mypy non sempre \u00e8 in grado di rilevare tali cose fino a quando gran parte del ciclo di importazione non \u00e8 stata elaborata. In Alore non c'erano ambiguit\u00e0 di questo tipo. Decisioni sbagliate prese nelle fasi iniziali dello sviluppo del sistema possono riservare sorprese sgradevoli ai programmatori anche molti anni dopo.<\/p>\n<h2>Conclusioni: la strada verso 5 milioni di righe di codice e nuovi orizzonti<\/h2>\n<p>\nIl progetto mypy ha fatto molta strada \u2014 dai primi prototipi, fino a un sistema che controlla i tipi del codice di produzione per un totale di 4 milioni di righe. Durante lo sviluppo, mypy ha standardizzato le annotazioni di tipo in Python. Oggi, intorno alla tipizzazione del codice Python \u00e8 emerso un potente ecosistema. Vi \u00e8 spazio per il supporto delle librerie, strumenti per IDE e editor, e diversi sistemi di controllo dei tipi, ognuno con i propri vantaggi e svantaggi.<\/p>\n<p>Sebbene il controllo dei tipi sia gi\u00e0 considerato in Dropbox come qualcosa di scontato, sono sicuro che stiamo ancora vivendo all'alba della tipizzazione del codice Python. Penso che le tecnologie di controllo dei tipi continueranno a evolversi e migliorarsi.<\/p>\n<p>Se non hai ancora utilizzato i controlli dei tipi nel tuo progetto Python su larga scala, sappi che ora \u00e8 un momento molto appropriato per iniziare la transizione alla tipizzazione statica. Ho parlato con chi ha effettuato questa transizione. Nessuno di loro si \u00e8 mai pentito. Il controllo dei tipi trasforma Python in un linguaggio molto pi\u00f9 adatto rispetto al \"classico Python\" per lo sviluppo di grandi progetti.<\/p>\n<p><b>Gentili lettori!<\/b> Utilizzi i controlli 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 5.0.1.1 - 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.\" \/>\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) 5.0.1.1\" \/>\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.\" \/>\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 per il controllo dei tipi di 4 milioni di righe di codice Python. Parte 3 | ProHoster","description":"Vi presentiamo la terza parte della traduzione del materiale sul percorso compiuto dall'azienda Dropbox nell'implementazione di un sistema di verifica dei tipi per il codice Python.","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.","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":{"focus":[],"additional":[]},"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-08-11 12:50:30","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}