4 controlli di tipo Python per mantenere pulito il codice

All'inizio, Python non aveva decorazioni di tipo. Ciò si adatta all'obiettivo generale di rendere il linguaggio veloce e facile da usare, con tipi di oggetti flessibili che si adattano alle svolte e ai giri della scrittura del codice e aiutano gli sviluppatori a mantenere il loro codice conciso.

Negli ultimi anni, tuttavia, Python ha aggiunto il supporto per le annotazioni di tipo, ispirando un'intera cultura del software dedicata al controllo dei tipi di Python durante lo sviluppo. Python non controlla i tipi in fase di esecuzione, almeno non ancora. Ma approfittando di un buon controllo del tipo, guidando il fucile con te nel tuo IDE preferito, puoi usare le annotazioni di tipo di Python per schermare molti errori comuni prima che entrino in produzione.

In questo articolo approfondiremo quattro dei principali componenti aggiuntivi per il controllo del tipo per Python. Tutti seguono più o meno lo stesso schema, scansionando il codice Python con annotazioni di tipo e fornendo feedback. Ma ognuno offre le proprie utili aggiunte al concetto di base.

Mypy

Mypy è stato probabilmente il primo sistema di controllo dei tipi statico per Python, poiché il lavoro su di esso è iniziato nel 2012 ed è ancora in fase di sviluppo attivo. È essenzialmente il prototipo di come funzionano le librerie di controllo dei tipi di terze parti in Python, anche se molte altre sono arrivate da allora e hanno ampliato le sue funzionalità.

Mypy può essere eseguito autonomamente o dalla riga di comando, oppure può funzionare come parte di un editor o dell'integrazione di linter dell'IDE. Molti editor e IDE integrano Mypy; L'estensione Python di Visual Studio Code può funzionare direttamente con esso. Quando viene eseguito, Mypy genera rapporti sulla coerenza del codice in base alle informazioni sul tipo che fornisce.

Se il codice non include annotazioni di tipo, Mypy non eseguirà la maggior parte dei controlli del codice. Tuttavia, puoi utilizzare Mypy per contrassegnare il codice non annotato. Questo può essere fatto con vari gradi di rigore a seconda delle proprie esigenze.

Se stai partendo da zero con una base di codice e desideri una strategia di linting preventivamente aggressiva, puoi utilizzare l' --strictopzione per impedire qualsiasi codice non tipizzato. D'altra parte, se stai lavorando con una base di codice legacy che non ha molte definizioni di tipo, puoi utilizzare opzioni più rilassate come impedire solo definizioni di funzioni non tipizzate con  --disallow-untyped-defs mentre consenti altro codice non tipizzato. E puoi sempre utilizzare commenti in linea come # type: ignoreper evitare che le singole righe vengano contrassegnate.

Mypy può utilizzare i file stub PEP 484 quando si desidera utilizzare i suggerimenti sul tipo per le interfacce pubbliche di un modulo. Inoltre, Mypy offre stubgenuno strumento che genera automaticamente file stub dal codice esistente. Per il codice non tipizzato, i file stub utilizzano tipi generici, che puoi quindi contrassegnare secondo necessità.

Pytype

Pytype, creato da Google, differisce da Mypy nell'uso dell'inferenza invece dei soli descrittori di tipo. In altre parole, Pytype tenta di determinare i tipi analizzando il flusso di codice, piuttosto che affidarsi strettamente alle annotazioni di tipo.

Pytype sbaglia dalla parte della clemenza ogni volta che ha senso farlo. Se hai un'operazione che funziona in fase di esecuzione e non contraddice alcuna annotazione, Pytype non si lamenterà di essa. Tuttavia, questo significa che alcuni problemi che dovrebbero essere contrassegnati (ad esempio, dichiarare una variabile con un tipo in un punto e quindi ridefinirla nello stesso contesto) passano senza preavviso. La documentazione afferma che tali cose non saranno consentite in futuro.

Se scegli di aggiungere annotazioni di tipo al tuo codice, la reveal_typefunzione di Pytype è  particolarmente utile. Se inserisci un'istruzione nel codice che legge reveal_type(expr), Pytype valuta expred emette un avviso che ne descrive il tipo. 

Notare che alcuni comportamenti Pytype sono controllati aggiungendo attributi al codice stesso. Ad esempio, se vuoi impedire a Pytype di lamentarsi degli attributi mancanti o dei membri del modulo impostati dinamicamente, devi aggiungere l'attributo _HAS_DYNAMIC_ATTRIBUTES = Truealla classe o al modulo in questione, invece di impostare una sorta di metadati di configurazione di Pytype.

Copyright / Pylance

Pyright è il controllo del tipo Python di Microsoft, incluso come parte dell'estensione Pylance per Visual Studio Code. Se sei già un utente VS Code, l'estensione Pylance è il modo più conveniente per lavorare con Pyright; basta installarlo e andare. Pyright fornisce una buona esperienza all-in-one di controllo dei tipi e di linting del codice, con molte delle stesse comodità e avanzamenti dei precedenti strumenti di analisi Python.

Come Pytype, Pyright può lavorare con basi di codice che non hanno alcuna informazione sul tipo. In questi casi, Pyright farà del suo meglio per dedurre quali tipi sono in gioco. Quindi puoi ancora ottenere buoni risultati con Pytype su basi di codice più vecchie senza dichiarazioni di tipo. Ma otterrai risultati migliori nel tempo man mano che aggiungi progressivamente annotazioni di tipo al tuo codice.

Pyright è altamente flessibile in modi che completano i design dei progetti Python del mondo reale. Come con altri controlli di tipo, Pyright può essere configurato in base al progetto con un file di configurazione in formato JSON nella directory del progetto. I singoli percorsi possono essere esclusi (mai controllati) o ignorati (errori e avvisi eliminati) nel file di configurazione e le opzioni sono altamente granulari.

In VS Code, le aree di lavoro con più radici possono avere ciascuna la propria configurazione di Pyright, nel caso in cui parti diverse del progetto necessitino di configurazioni di linting diverse. Allo stesso modo, è possibile definire più "ambienti di esecuzione" all'interno di un progetto, ciascuno con i propri percorsi venv o di importazione.

Pira 

Creato dagli sviluppatori di Facebook e Instagram, Pyre è in realtà due strumenti in uno: un controllo del tipo (Pyre) e uno strumento di analisi del codice statico (Pysa). I due sono progettati per lavorare mano nella mano per fornire un livello più elevato di controllo e analisi rispetto ad altri strumenti, sebbene l'utente debba fare un po 'di lavoro pesante per trarne il massimo vantaggio.

Pyre ha un approccio simile a Pytype e Mypy. Il codice non tipizzato viene gestito in modo più indulgente rispetto al codice digitato, quindi puoi iniziare con una base di codice Python non tipizzata e aggiungere annotazioni funzione per funzione e modulo per modulo. Attiva la "modalità rigorosa" in un modulo e Pyre segnalerà eventuali annotazioni mancanti. Oppure puoi impostare la modalità rigorosa come predefinita e disattivarla a livello di modulo. Pyre funziona anche con i file stub in formato .pyi.

Pyre ha una potente funzionalità per la migrazione di basi di codice in un formato digitato. L' inferopzione della riga di comando inserisce un file o una directory, fa ipotesi plausibili sui tipi utilizzati e applica le annotazioni ai file. Tuttavia, prima ti consigliamo di eseguire il backup del codice! (Se desideri ottenere informazioni sul tipo da un programma Python in esecuzione , puoi farlo con un altro progetto Facebook / Instagram, MonkeyType.)

Mentre le funzionalità di Pyre fanno eco a quelle degli altri pacchetti descritti qui, Pysa è unico. Pysa esegue l '"analisi della contaminazione" sul codice per identificare potenziali problemi di sicurezza, basandosi su una libreria di analisi del flusso per determinati componenti software e contrassegnando il codice che sembra essere vulnerabile. Anche qualsiasi elemento toccato da quel codice verrà contrassegnato come contaminato, sebbene sia possibile specificare componenti che disinfettano i dati e rimuovono tali dati dal grafico della contaminazione.

Uno svantaggio è che la libreria di analisi della contaminazione di componenti di terze parti di Pysa è ancora piccola, quindi potrebbe essere necessario ideare il proprio modello. Ma molte delle analisi di contaminazione sono per software ampiamente utilizzato, come il framework web Django, l'ORM Alchemy SQL e la libreria di data science di Pandas, per non parlare delle analisi per problemi di filesystem comuni.

Come fare di più con Python

  • Come lavorare con il tipo di dati dell'elenco Python
  • Come creare pacchetti di app Python con BeeWare Briefcase
  • Come eseguire Anaconda fianco a fianco con altri Pythons
  • Come usare le dataclass Python
  • Inizia con async in Python
  • Come usare asyncio in Python
  • 3 passaggi per una revisione asincrona di Python
  • Come utilizzare PyInstaller per creare eseguibili Python
  • Tutorial Cython: come velocizzare Python
  • Come installare Python in modo intelligente
  • Come gestire i progetti Python con Poetry
  • Come gestire progetti Python con Pipenv
  • Virtualenv e venv: spiegazione degli ambienti virtuali Python
  • Python virtualenv e venv cosa fare e cosa non fare
  • Spiegazione del threading e dei sottoprocessi di Python
  • Come utilizzare il debugger Python
  • Come usare timeit per profilare il codice Python
  • Come usare cProfile per profilare il codice Python
  • Come convertire Python in JavaScript (e viceversa)