Guida a Pyright: controllo statico dei tipi veloce per il codice Python
Scopri come installare e usare Pyright per il controllo statico dei tipi in Python. Questa guida copre configurazione, integrazione con IDE, troubleshooting e quando scegliere Pyright rispetto a Mypy.
Le type hint rendono il codice Python più facile da capire e mantenere. Ma c’è un problema: da sole non intercettano gli errori. Ti serve un type checker per verificare che il tuo codice rispetti davvero i tipi che hai dichiarato.
Ho usato sia Mypy che Pyright in produzione. Il vantaggio di velocità di Pyright è più evidente durante lo sviluppo. Gli errori di tipo compaiono mentre scrivi, non dopo il salvataggio. Su codebase grandi, questo ciclo di feedback più rapido fa davvero la differenza.
Questo tutorial copre tutto ciò che ti serve per iniziare a usare Pyright in modo efficace. Ti mostrerò come installarlo, configurarlo per il tuo progetto e integrarlo con VS Code. Metterò anche in luce le differenze tra Pyright e Mypy.
Cos’è Pyright?
Pyright è un type checker statico per Python sviluppato da Microsoft. Legge il tuo codice, analizza le annotazioni di tipo e segnala errori quando i tipi non corrispondono. A differenza dei controlli a runtime, che intercettano gli errori quando il codice viene eseguito, l’analisi statica li trova prima ancora di lanciare qualcosa.
Mentre la maggior parte degli strumenti Python è scritta in Python, Pyright è scritto in TypeScript e gira su Node.js. Una scelta insolita per uno strumento Python, giusto? Ma è il motivo per cui Pyright è così veloce. Il motore JavaScript V8 esegue molto più rapidamente di quanto farebbe CPython.
Troverai Pyright in due modi. Puoi eseguirlo da riga di comando nelle pipeline CI/CD per intercettare errori di tipo prima dei merge. Oppure potresti già usarlo senza saperlo. Alimenta Pylance, l’estensione Python di Microsoft per VS Code. Quei segnetti rossi sotto gli errori di tipo? È Pyright che lavora dietro le quinte.
Lo strumento include stub di tipo integrati per la libreria standard di Python e pacchetti comuni. Non devi installare altro per controllare codice che usa os,json otyping. Per i pacchetti di terze parti, Pyright usa stub mantenuti dalla community (typeshed) oppure stub specifici del pacchetto che installi a parte.
Come installare Pyright
Vediamo ora come far funzionare Pyright sul tuo sistema. Hai due opzioni di installazione: npm (l’approccio nativo) o pip (il wrapper Python).
Installare Pyright con npm
L’installazione consigliata usa npm perché Pyright gira su Node.js. Ti servirà Node.js versione 14.0.0 o superiore.
# Global installationnpminstall-g pyright
# Run without installing globally
npx pyright
# Local project installationnpminstall --save-dev pyrightOfferto da
Io uso l’installazione globale per controlli veloci e quella locale per i progetti in cui voglio fissare la versione. L’approccio con npxè utile per esecuzioni una tantum senza aggiungere pacchetti globali.
Installare Pyright tramite wrapper Python
Se il tuo team lavora esclusivamente in Python e non vuole Node.js nella toolchain, esiste un wrapper su PyPI:
# Standard installation
pip install pyright
# Recommended: includes Node.js automatically
pip install pyright[nodejs]Offerto da
Il wrapper controlla se Node.js è presente sul sistema. Se manca, scarica automaticamente una versione standalone. L’extra [nodejs] usa un metodo di download più affidabile rispetto al default.
Tieni a mente i compromessi. La prima esecuzione impiega più tempo per scaricare le dipendenze. Gli ambienti CI con accesso di rete limitato potrebbero fallire. E la versione su PyPI a volte è in ritardo di qualche giorno rispetto alle release su npm.
Per la maggior parte dei team Python, il wrapper va benissimo. Ma se incontri problemi, torna all’installazione via npm. È più affidabile.
Eseguire Pyright su un progetto Python
Una volta installato, eseguire Pyright è semplice. Vai nella directory del tuo progetto ed esegui:
Tutto qui, davvero. Pyright cerca i file Python, li analizza e segnala eventuali errori di tipo. Nessun setup complicato richiesto.
Cosa controlla Pyright di default
Cosa verifica Pyright? Senza alcuna configurazione, effettua diversi controlli. Valida che le annotazioni di tipo corrispondano all’uso reale. Intercetta variabili non definite e codice irraggiungibile. Verifica correttamente gli import. Segnala incongruenze evidenti, come passare una stringa dove è atteso un intero.
Ecco un esempio di output da un progetto con errori:
/src/utils.py:12:15 - error: Argument of type "str" cannot be assigned
to parameter "count" of type "int" in function "process_items"
"str" is not assignable to "int" (reportArgumentType)
/src/main.py:45:9 - error: "user" is possibly unbound (reportPossiblyUnbound)
2 errors, 0 warnings, 0 informationsOfferto da
Ogni errore mostra percorso del file, riga, colonna e descrizione. Il nome della regola tra parentesi (ad esempio reportArgumentType) indica esattamente quale controllo ha generato l’errore. Questo conta quando vuoi sopprimere regole specifiche. Lo vediamo tra poco.
Capire i codici di uscita
Pyright restituisce codici di uscita diversi a seconda del risultato:
Exit Code
Meaning
0
Nessun errore trovato
1
Trovati errori di tipo
2
Errore fatale (crash, memoria esaurita)
3
Errore nel file di configurazione
4
Argomenti da riga di comando non validi
Nelle pipeline CI, di solito vuoi che la build fallisca con il codice di uscita 1. I codici 2-4 indicano che è successo qualcosa allo strumento stesso, non al tuo codice.
Configurare Pyright
Sebbene Pyright funzioni subito, i progetti reali richiedono personalizzazione. Vorrai specificare quali file controllare, quale versione di Python targettizzare e quanto rigorosa debba essere l’analisi. Vediamo le opzioni chiave di configurazione.
Modalità di type checking
Pyright offre quattro livelli di rigidità. La modalità che scegli determina quante regole sono attive.
Mode
Behavior
off
Nessun type checking; solo errori di sintassi
basic
Controlli fondamentali; analisi più permissiva
standard
Controlli completi; default nel 2026
strict
Massima sicurezza; richiede annotazioni complete
Quale modalità scegliere? Per i nuovi progetti, inizia con la modalità standard. Intercetta bug reali senza sommergerti di errori. Lavori con codice legacy? La modalità basic funziona meglio quando adotti la tipizzazione gradualmente. Riserva la modalità strict a librerie e infrastrutture critiche dove vuoi la massima sicurezza.
Avviso: il salto da standard a strict è notevole. La modalità strict abilita circa 30 regole aggiuntive, tra cui l’obbligo di annotazioni di tipo per tutti i parametri e i valori di ritorno delle funzioni. Aspettati un aumento di errori segnalati di 10 volte quando passi a strict. L’ho imparato a mie spese.
La modalità strict richiede annotazioni di tipo complete. Immagine dell’autore
File di configurazione
Pyright legge la configurazione da pyrightconfig.json o pyproject.toml. Se entrambi esistono, pyrightconfig.json ha la precedenza.
Ecco un pyrightconfig.json minimale:
{"include":["src"],"exclude":["**/node_modules","**/__pycache__","**/.venv"],"pythonVersion":"3.12","typeCheckingMode":"standard"}Offerto da
L’equivalente in pyproject.toml:
[tool.pyright]
include = ["src"]
exclude = ["**/node_modules", "**/__pycache__", "**/.venv"]
pythonVersion = "3.12"
typeCheckingMode = "standard"Offerto da
Il file di configurazione controlla il comportamento di Pyright. Immagine dell’autore.
Un dettaglio critico che inganna molti: se definisci exclude manualmente, sostituisce interamente i default. Includi sempre node_modules,__pycache__ e il tuo ambiente virtuale nei pattern di exclude personalizzati. Altrimenti Pyright proverà ad analizzare le dipendenze, causando enormi rallentamenti. Fidati, non vuoi aspettare 10 minuti per un type check.
Configurazione dell’ambiente virtuale
Come trova Pyright i pacchetti installati? Devi dirgli dove cercare. Configuralo con venvPath e venv:
Questo dice a Pyright di cercare i pacchetti in ./.venv. Se usi un percorso diverso per l’ambiente virtuale, adegua di conseguenza. Senza questo, Pyright non trova le dipendenze installate e segnala errori di import mancanti per tutto.
Sopprimere le diagnostiche
A volte Pyright ha tecnicamente ragione ma hai comunque bisogno di silenziare errori specifici. Magari lavori con codice legacy, o in un caso specifico sai più tu del type checker. Puoi sopprimere gli errori su tre livelli.
Soppressione a livello di configurazione
Disattiva regole globalmente:
{"reportMissingTypeStubs":"none","reportUnusedVariable":"warning"}Offerto da
Soppressione a livello di file
Aggiungi un commento all’inizio del file:
# pyright: basic# pyright: reportPrivateUsage=falseOfferto da
Soppressione a livello di riga
Sopprimi una singola riga:
x:int="hello"# type: ignore
x:int="hello"# pyright: ignore
x:int="hello"# pyright: ignore[reportAssignmentType]Offerto da
La sintassi con regola specifica ([reportAssignmentType]) è utile quando vuoi silenziare un solo controllo senza disabilitare gli altri sulla stessa riga.
Vista la configurazione, vediamo come Pyright si integra con il tuo ambiente di sviluppo.
Pyright in VS Code e IDE
Se sei come la maggior parte degli sviluppatori Python, userai Pyright tramite Pylance più che da riga di comando. Capire questa relazione ti aiuta a configurare correttamente l’editor ed evitare tranelli comuni.
Pyright vs. Pylance
Pylance è l’estensione di Microsoft per VS Code che include il motore di type checking di Pyright. Quando installi Pylance, ottieni automaticamente Pyright. Ma Pylance aggiunge funzionalità non presenti nell’open source Pyright:
Evidenziazione semantica: variabili colorate in base al tipo
Auto-import avanzato: suggerimenti di import più intelligenti
Navigazione del codice: "Trova tutti i riferimenti" in tutto lo workspace
Queste funzioni sono closed-source e disponibili solo in VS Code. Se usi Neovim, Emacs o un altro editor, hai le funzionalità core di Pyright ma non questi extra.
Pylance evidenzia gli errori di tipo nell’editor. Immagine dell’autore.
Impostazioni essenziali di VS Code
Configura Pylance dalle impostazioni di VS Code:
{"python.languageServer":"Pylance","python.analysis.typeCheckingMode":"standard","python.analysis.diagnosticMode":"openFilesOnly"}Offerto da
L’impostazione diagnosticMode influisce sulle prestazioni."openFilesOnly" analizza solo i file aperti. "workspace"analizza tutto ma usa più memoria e CPU.
Trappole di configurazione comuni
La scelta dell’interprete conta. Pylance usa l’interprete Python selezionato per trovare i pacchetti installati. Se compaiono all’improvviso errori per pacchetti che sai di aver installato, verifica che in basso nella status bar di VS Code sia selezionato l’interprete giusto.
La selezione dell’interprete influisce sui percorsi di discovery dei pacchetti. Immagine dell’autore.
I default del CLI e di Pylance differiscono. Pylance imposta typeCheckingMode su "off" mentre il CLI usa "standard". Pylance aggiunge automaticamentesrc ai percorsi di ricerca; il CLI no. Per un comportamento coerente tra editor e CI, imposta esplicitamente tutte le opzioni in pyproject.toml.
Il fenomeno del "codice in grigio". Pylance sbiadisce il codice irraggiungibile in base all’analisi dei tipi. Se del codice appare in grigio inaspettatamente, controlla la funzione chiamata subito prima. Una funzione tipizzata come che restituisce NoReturnfa sembrare irraggiungibile tutto ciò che segue.
Pyright vs. Mypy: quando usare l’uno o l’altro
Ti starai chiedendo: dovrei usare Pyright o restare con Mypy? Entrambi gli strumenti sono pronti per la produzione, e la scelta dipende dal tuo workflow e dai requisiti. Ti riassumo le differenze chiave.
Velocità e reattività
Pyright è circa 3-5 volte più veloce di Mypy nelle scansioni complete del progetto ed è praticamente istantaneo per i controlli incrementali. Questo conta soprattutto durante lo sviluppo, quando vuoi feedback immediato.
Mypy ha una modalità demone (dmypy) che migliora le prestazioni, ma resta più lento e talvolta ha problemi di cache che richiedono riavvii.
Differenze nell’inferenza dei tipi
Qui le cose si fanno interessanti. Gli strumenti inferiscono i tipi in modo diverso. Considera questo codice:
Pyright inferisce tuple[Literal[10], Literal[20]], preservando i valori esatti perché le tuple sono immutabili. Mypy inferiscetuple[int, int], generalizzando i tipi.
L’approccio di Pyright intercetta più errori ma a volte crea attrito quando le funzioni si aspettano tipi generali. In pratica conta poco perché Literal[10]è un sottotipo valido di int.
Analisi del codice non annotato
Questa è la differenza pratica più grande ed è un game changer per le codebase legacy. Mypy salta le funzioni non annotate di default. Pyright le analizza comunque, intercettando errori evidenti anche senza type hint.
Per codebase legacy con annotazioni scarse, Pyright funge da potente linter che intercetta variabili non definite e chiamate di metodi impossibili. Mypy tratta quelle funzioni come "dinamiche" e le ignora.
Supporto ai plugin
Mypy supporta plugin per framework come Django e SQLAlchemy. Questi plugin comprendono la magia degli ORM e forniscono tipi accurati per attributi generati dinamicamente.
Pyright non ha un sistema di plugin. Si affida interamente agli stub di tipo. Nel 2026, la maggior parte delle librerie principali ha stub di alta qualità, quindi conta meno di un tempo. Ma se usi un framework con pesante metaprogrammazione, verifica che esistano buoni stub prima di impegnarti con Pyright.
Aspetto
Pyright
Mypy
Velocità
3-5x più veloce
Più lento
Codice non annotato
Analizzato di default
Saltato di default
Integrazione IDE
Alimenta VS Code/Pylance
Richiede setup separato
Sistema di plugin
Nessuno
Django, SQLAlchemy, ecc.
Usa Pylance (Pyright) durante lo sviluppo per feedback istantaneo, e valuta di eseguire sia Pyright che Mypy in CI se il tuo progetto usa plugin di framework.
Problemi comuni con Pyright
Quando Pyright segnala errori inaspettati, di solito la causa è una di queste.
Stub di tipo mancanti
Ti è mai capitato questo errore? Pyright si lamenta quando non trova informazioni di tipo per un pacchetto:
Import "requests" could not be resolved (reportMissingImports)Offerto da
Stub mancanti generano avvisi di import. Immagine dell’autore.
Per prima cosa, verifica che il pacchetto sia installato nel tuo ambiente virtuale e che Pyright sappia dove trovarlo (usando le impostazioni venvPathevenv viste prima).
Se il pacchetto è installato ma manca di informazioni di tipo, installa gli stub della community:
pip install types-requests types-PyYAML types-redisOfferto da
Per i pacchetti senza stub disponibili, hai due opzioni. Puoi disattivare l’avviso con "reportMissingTypeStubs": "none"nella configurazione. Oppure generare tu stesso degli stub di bozza:
Questo crea un file scheletro .pyi che puoi riempire con i metodi che usi davvero.
Errori nei pre-commit hook
Pyright funziona in locale ma fallisce nei pre-commit hook? Di solito il problema è l’isolamento dell’ambiente. Pre-commit esegue gli hook in ambienti isolati che non vedono i pacchetti installati del tuo progetto.
Risolvi puntando l’hook al tuo ambiente virtuale:
repos:-repo: https://github.com/RobertCraigie/pyright-python
rev: v1.1.408
hooks:-id: pyright
args:["--venvpath",".","--venv",".venv"]Offerto da
Errori inaspettati in modalità strict
Hai attivato la modalità strict e vedi all’improvviso migliaia di errori? Niente panico. È normale. La modalità strict richiede annotazioni di tipo complete. Parti da basic o standard, aggiungi annotazioni gradualmente e abilita strict solo sui moduli completamente tipizzati.
Usa commenti per file per mantenere il codice legacy in una modalità permissiva:
Questo ti permette di applicare controlli rigorosi al codice nuovo mentre migri gradualmente quello vecchio.
Oltre al troubleshooting, ecco alcune strategie per rendere l’esperienza con Pyright più fluida fin da subito.
Best practice per usare Pyright
Dopo aver lavorato con Pyright su diversi progetti, ho imparato alcune cose che ne facilitano l’adozione. Adottare queste best practice di coding garantisce che il type checking resti un aiuto, non un ostacolo.
Inizia con la modalità standard. Come detto, intercetta bug reali senza richiedere annotazioni complete. Potrai sempre inasprire le regole in seguito.
Fissa la versione di Pyright. Pyright rilascia spesso nuove versioni e a volte le nuove rilasciano segnalazioni su codice che prima passava. In CI, un pip install pyrightnon fissato può causare fallimenti del build il lunedì mattina per release uscite nel weekend. Ci sono passato. Non è divertente.
[tool.pyright]
# In pyproject.toml
pythonVersion = "3.12"Offerto da
# In requirements-dev.txt
pyright==1.1.408Offerto da
Correggi gli errori in modo incrementale. Non provare a eliminare 10.000 errori in una volta. Usa l’array strictper applicare controlli severi solo a directory specifiche:
{"typeCheckingMode":"standard","strict":["src/core","src/api"]}Offerto da
Usa presto i file di configurazione. Anche per progetti piccoli, una configurazione esplicita evita sorprese. Dedica cinque minuti a documentare la tua versione di Python, il percorso dell’ambiente virtuale e il livello di rigore scelto. Il te del futuro ti ringrazierà.
Non puntare alla perfezione subito. Usa # pyright: ignoreliberamente all’inizio. Segna così il debito tecnico in modo visibile, da ripulire nel tempo senza bloccare i progressi. Il meglio è nemico del bene, soprattutto quando adotti nuovi strumenti.
Conclusione
Pyright si è guadagnato il posto di scelta pratica per la velocità tra i type checker Python. Le sue basi in TypeScript offrono vantaggi concreti, soprattutto durante i controlli incrementali che avvengono mentre scrivi.
Tieni a mente che strumenti come Pyright funzionano al meglio quando i concetti base di Python sono naturali. Quindi se alcune parti di questo tutorial ti sono sembrate più difficili del previsto, o se non ti è ancora chiaro cosa stia facendo Pyright, ti consiglio il nostro corso Introduction to Python for Developers.
Sono un data engineer e community builder: lavoro su pipeline dati, cloud e strumenti di AI, e scrivo tutorial pratici e ad alto impatto per DataCamp e per sviluppatori alle prime armi.
Domande frequenti su Pyright
Pyright funziona con i notebook Jupyter?⌄
Sì! Pyright supporta i file.ipynb tramite l’estensione Pylance in VS Code. Otterrai il type checking in tempo reale mentre scrivi le celle del notebook. Per il controllo da riga di comando, usapyright --pythonpath per includere l’ambiente virtuale del notebook.
Posso usare Pyright con i pre-commit hook?⌄
Assolutamente. Usa l’hookpyright-python dal repo ufficiale. Assicurati solo di configurare venvPath nel tuo file di config così pre-commit può trovare le dipendenze. Altrimenti otterrai falsi errori di import.
Pyright rallenterà il mio editor?⌄
Non in modo percepibile. Pyright gira in un processo separato e per default analizza solo i file aperti. Se hai un monorepo enorme, imposta "diagnosticMode": "openFilesOnly" nelle impostazioni di VS Code per mantenere il tutto scattante.
Posso adottare Pyright gradualmente in una codebase legacy?⌄
Sì, ed è persino più semplice che con Mypy. Inizia con"typeCheckingMode": "basic" e usa l’array ignore per escludere le cartelle legacy. All’inizio aggiungi commenti # pyright: ignore liberamente, poi puliscili col tempo.
Pyright supporta Python 2.7?⌄
No. Pyright supporta solo Python 3.0 e superiori. Se sei ancora su Python 2.7, dovrai restare con Mypy o prima aggiornare la codebase. Python 2 è andato in end-of-life nel 2020, quindi è comunque ora di andare avanti.
Come si comporta Pyright rispetto a Mypy in termini di prestazioni?⌄
Pyright è sensibilmente più veloce, soprattutto per i controlli incrementali. Gira su Node.js invece che su Python, il che rende l’analisi più rapida. Vedrai la differenza soprattutto mentre digiti nell’editor: gli errori compaiono all’istante, non dopo il salvataggio. Per le pipeline CI, entrambi vanno bene.
Quali sono le principali differenze tra Pyright e Pylance?⌄
Pensala così: Pyright è il motore, Pylance è l’auto. Pyright è il type checker open-source che puoi usare ovunque. Pylance è l’estensione di Microsoft per VS Code che avvolge Pyright e aggiunge extra come evidenziazione semantica e import smart. Se non usi VS Code, stai usando direttamente Pyright.
Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Le type hint rendono il codice Python più facile da capire e mantenere. Ma c’è un problema: da sole non intercettano gli errori. Ti serve un type checker per verificare che il tuo codice rispetti davvero i tipi che hai dichiarato.
Ho usato sia Mypy che Pyright in produzione. Il vantaggio di velocità di Pyright è più evidente durante lo sviluppo. Gli errori di tipo compaiono mentre scrivi, non dopo il salvataggio. Su codebase grandi, questo ciclo di feedback più rapido fa davvero la differenza.
Questo tutorial copre tutto ciò che ti serve per iniziare a usare Pyright in modo efficace. Ti mostrerò come installarlo, configurarlo per il tuo progetto e integrarlo con VS Code. Metterò anche in luce le differenze tra Pyright e Mypy.
Cos’è Pyright?
Pyright è un type checker statico per Python sviluppato da Microsoft. Legge il tuo codice, analizza le annotazioni di tipo e segnala errori quando i tipi non corrispondono. A differenza dei controlli a runtime, che intercettano gli errori quando il codice viene eseguito, l’analisi statica li trova prima ancora di lanciare qualcosa.
Mentre la maggior parte degli strumenti Python è scritta in Python, Pyright è scritto in TypeScript e gira su Node.js. Una scelta insolita per uno strumento Python, giusto? Ma è il motivo per cui Pyright è così veloce. Il motore JavaScript V8 esegue molto più rapidamente di quanto farebbe CPython.
Troverai Pyright in due modi. Puoi eseguirlo da riga di comando nelle pipeline CI/CD per intercettare errori di tipo prima dei merge. Oppure potresti già usarlo senza saperlo. Alimenta Pylance, l’estensione Python di Microsoft per VS Code. Quei segnetti rossi sotto gli errori di tipo? È Pyright che lavora dietro le quinte.
Lo strumento include stub di tipo integrati per la libreria standard di Python e pacchetti comuni. Non devi installare altro per controllare codice che usa
os,jsonotyping. Per i pacchetti di terze parti, Pyright usa stub mantenuti dalla community (typeshed) oppure stub specifici del pacchetto che installi a parte.Come installare Pyright
Vediamo ora come far funzionare Pyright sul tuo sistema. Hai due opzioni di installazione: npm (l’approccio nativo) o pip (il wrapper Python).
Installare Pyright con npm
L’installazione consigliata usa npm perché Pyright gira su Node.js. Ti servirà Node.js versione 14.0.0 o superiore.
Io uso l’installazione globale per controlli veloci e quella locale per i progetti in cui voglio fissare la versione. L’approccio con
npxè utile per esecuzioni una tantum senza aggiungere pacchetti globali.Installare Pyright tramite wrapper Python
Se il tuo team lavora esclusivamente in Python e non vuole Node.js nella toolchain, esiste un wrapper su PyPI:
Il wrapper controlla se Node.js è presente sul sistema. Se manca, scarica automaticamente una versione standalone. L’extra
[nodejs]usa un metodo di download più affidabile rispetto al default.Tieni a mente i compromessi. La prima esecuzione impiega più tempo per scaricare le dipendenze. Gli ambienti CI con accesso di rete limitato potrebbero fallire. E la versione su PyPI a volte è in ritardo di qualche giorno rispetto alle release su npm.
Per la maggior parte dei team Python, il wrapper va benissimo. Ma se incontri problemi, torna all’installazione via npm. È più affidabile.
Eseguire Pyright su un progetto Python
Una volta installato, eseguire Pyright è semplice. Vai nella directory del tuo progetto ed esegui:
Tutto qui, davvero. Pyright cerca i file Python, li analizza e segnala eventuali errori di tipo. Nessun setup complicato richiesto.
Cosa controlla Pyright di default
Cosa verifica Pyright? Senza alcuna configurazione, effettua diversi controlli. Valida che le annotazioni di tipo corrispondano all’uso reale. Intercetta variabili non definite e codice irraggiungibile. Verifica correttamente gli import. Segnala incongruenze evidenti, come passare una stringa dove è atteso un intero.
Ecco un esempio di output da un progetto con errori:
Ogni errore mostra percorso del file, riga, colonna e descrizione. Il nome della regola tra parentesi (ad esempio
reportArgumentType) indica esattamente quale controllo ha generato l’errore. Questo conta quando vuoi sopprimere regole specifiche. Lo vediamo tra poco.Capire i codici di uscita
Pyright restituisce codici di uscita diversi a seconda del risultato:
Exit Code
Meaning
0
Nessun errore trovato
1
Trovati errori di tipo
2
Errore fatale (crash, memoria esaurita)
3
Errore nel file di configurazione
4
Argomenti da riga di comando non validi
Nelle pipeline CI, di solito vuoi che la build fallisca con il codice di uscita 1. I codici 2-4 indicano che è successo qualcosa allo strumento stesso, non al tuo codice.
Configurare Pyright
Sebbene Pyright funzioni subito, i progetti reali richiedono personalizzazione. Vorrai specificare quali file controllare, quale versione di Python targettizzare e quanto rigorosa debba essere l’analisi. Vediamo le opzioni chiave di configurazione.
Modalità di type checking
Pyright offre quattro livelli di rigidità. La modalità che scegli determina quante regole sono attive.
Mode
Behavior
off
Nessun type checking; solo errori di sintassi
basic
Controlli fondamentali; analisi più permissiva
standard
Controlli completi; default nel 2026
strict
Massima sicurezza; richiede annotazioni complete
Quale modalità scegliere? Per i nuovi progetti, inizia con la modalità standard. Intercetta bug reali senza sommergerti di errori. Lavori con codice legacy? La modalità basic funziona meglio quando adotti la tipizzazione gradualmente. Riserva la modalità strict a librerie e infrastrutture critiche dove vuoi la massima sicurezza.
Avviso: il salto da standard a strict è notevole. La modalità strict abilita circa 30 regole aggiuntive, tra cui l’obbligo di annotazioni di tipo per tutti i parametri e i valori di ritorno delle funzioni. Aspettati un aumento di errori segnalati di 10 volte quando passi a strict. L’ho imparato a mie spese.
La modalità strict richiede annotazioni di tipo complete. Immagine dell’autore
File di configurazione
Pyright legge la configurazione da
pyrightconfig.jsonopyproject.toml. Se entrambi esistono,pyrightconfig.jsonha la precedenza.Ecco un
pyrightconfig.jsonminimale:L’equivalente in
pyproject.toml:Il file di configurazione controlla il comportamento di Pyright. Immagine dell’autore.
Un dettaglio critico che inganna molti: se definisci
excludemanualmente, sostituisce interamente i default. Includi semprenode_modules,__pycache__e il tuo ambiente virtuale nei pattern di exclude personalizzati. Altrimenti Pyright proverà ad analizzare le dipendenze, causando enormi rallentamenti. Fidati, non vuoi aspettare 10 minuti per un type check.Configurazione dell’ambiente virtuale
Come trova Pyright i pacchetti installati? Devi dirgli dove cercare. Configuralo con
venvPathevenv:Questo dice a Pyright di cercare i pacchetti in
./.venv. Se usi un percorso diverso per l’ambiente virtuale, adegua di conseguenza. Senza questo, Pyright non trova le dipendenze installate e segnala errori di import mancanti per tutto.Sopprimere le diagnostiche
A volte Pyright ha tecnicamente ragione ma hai comunque bisogno di silenziare errori specifici. Magari lavori con codice legacy, o in un caso specifico sai più tu del type checker. Puoi sopprimere gli errori su tre livelli.
Soppressione a livello di configurazione
Disattiva regole globalmente:
Soppressione a livello di file
Aggiungi un commento all’inizio del file:
Soppressione a livello di riga
Sopprimi una singola riga:
La sintassi con regola specifica (
[reportAssignmentType]) è utile quando vuoi silenziare un solo controllo senza disabilitare gli altri sulla stessa riga.Vista la configurazione, vediamo come Pyright si integra con il tuo ambiente di sviluppo.
Pyright in VS Code e IDE
Se sei come la maggior parte degli sviluppatori Python, userai Pyright tramite Pylance più che da riga di comando. Capire questa relazione ti aiuta a configurare correttamente l’editor ed evitare tranelli comuni.
Pyright vs. Pylance
Pylance è l’estensione di Microsoft per VS Code che include il motore di type checking di Pyright. Quando installi Pylance, ottieni automaticamente Pyright. Ma Pylance aggiunge funzionalità non presenti nell’open source Pyright:
Queste funzioni sono closed-source e disponibili solo in VS Code. Se usi Neovim, Emacs o un altro editor, hai le funzionalità core di Pyright ma non questi extra.
Pylance evidenzia gli errori di tipo nell’editor. Immagine dell’autore.
Impostazioni essenziali di VS Code
Configura Pylance dalle impostazioni di VS Code:
L’impostazione
diagnosticModeinfluisce sulle prestazioni."openFilesOnly"analizza solo i file aperti."workspace"analizza tutto ma usa più memoria e CPU.Trappole di configurazione comuni
La scelta dell’interprete conta. Pylance usa l’interprete Python selezionato per trovare i pacchetti installati. Se compaiono all’improvviso errori per pacchetti che sai di aver installato, verifica che in basso nella status bar di VS Code sia selezionato l’interprete giusto.
La selezione dell’interprete influisce sui percorsi di discovery dei pacchetti. Immagine dell’autore.
I default del CLI e di Pylance differiscono. Pylance imposta
typeCheckingModesu"off"mentre il CLI usa"standard". Pylance aggiunge automaticamentesrcai percorsi di ricerca; il CLI no. Per un comportamento coerente tra editor e CI, imposta esplicitamente tutte le opzioni inpyproject.toml.Il fenomeno del "codice in grigio". Pylance sbiadisce il codice irraggiungibile in base all’analisi dei tipi. Se del codice appare in grigio inaspettatamente, controlla la funzione chiamata subito prima. Una funzione tipizzata come che restituisce
NoReturnfa sembrare irraggiungibile tutto ciò che segue.Pyright vs. Mypy: quando usare l’uno o l’altro
Ti starai chiedendo: dovrei usare Pyright o restare con Mypy? Entrambi gli strumenti sono pronti per la produzione, e la scelta dipende dal tuo workflow e dai requisiti. Ti riassumo le differenze chiave.
Velocità e reattività
Pyright è circa 3-5 volte più veloce di Mypy nelle scansioni complete del progetto ed è praticamente istantaneo per i controlli incrementali. Questo conta soprattutto durante lo sviluppo, quando vuoi feedback immediato.
Mypy ha una modalità demone (
dmypy) che migliora le prestazioni, ma resta più lento e talvolta ha problemi di cache che richiedono riavvii.Differenze nell’inferenza dei tipi
Qui le cose si fanno interessanti. Gli strumenti inferiscono i tipi in modo diverso. Considera questo codice:
Pyright inferisce
tuple[Literal[10], Literal[20]], preservando i valori esatti perché le tuple sono immutabili. Mypy inferiscetuple[int, int], generalizzando i tipi.L’approccio di Pyright intercetta più errori ma a volte crea attrito quando le funzioni si aspettano tipi generali. In pratica conta poco perché
Literal[10]è un sottotipo valido diint.Analisi del codice non annotato
Questa è la differenza pratica più grande ed è un game changer per le codebase legacy. Mypy salta le funzioni non annotate di default. Pyright le analizza comunque, intercettando errori evidenti anche senza type hint.
Per codebase legacy con annotazioni scarse, Pyright funge da potente linter che intercetta variabili non definite e chiamate di metodi impossibili. Mypy tratta quelle funzioni come "dinamiche" e le ignora.
Supporto ai plugin
Mypy supporta plugin per framework come Django e SQLAlchemy. Questi plugin comprendono la magia degli ORM e forniscono tipi accurati per attributi generati dinamicamente.
Pyright non ha un sistema di plugin. Si affida interamente agli stub di tipo. Nel 2026, la maggior parte delle librerie principali ha stub di alta qualità, quindi conta meno di un tempo. Ma se usi un framework con pesante metaprogrammazione, verifica che esistano buoni stub prima di impegnarti con Pyright.
Aspetto
Pyright
Mypy
Velocità
3-5x più veloce
Più lento
Codice non annotato
Analizzato di default
Saltato di default
Integrazione IDE
Alimenta VS Code/Pylance
Richiede setup separato
Sistema di plugin
Nessuno
Django, SQLAlchemy, ecc.
Usa Pylance (Pyright) durante lo sviluppo per feedback istantaneo, e valuta di eseguire sia Pyright che Mypy in CI se il tuo progetto usa plugin di framework.
Problemi comuni con Pyright
Quando Pyright segnala errori inaspettati, di solito la causa è una di queste.
Stub di tipo mancanti
Ti è mai capitato questo errore? Pyright si lamenta quando non trova informazioni di tipo per un pacchetto:
Stub mancanti generano avvisi di import. Immagine dell’autore.
Per prima cosa, verifica che il pacchetto sia installato nel tuo ambiente virtuale e che Pyright sappia dove trovarlo (usando le impostazioni
venvPathevenvviste prima).Se il pacchetto è installato ma manca di informazioni di tipo, installa gli stub della community:
Per i pacchetti senza stub disponibili, hai due opzioni. Puoi disattivare l’avviso con
"reportMissingTypeStubs": "none"nella configurazione. Oppure generare tu stesso degli stub di bozza:Questo crea un file scheletro
.pyiche puoi riempire con i metodi che usi davvero.Errori nei pre-commit hook
Pyright funziona in locale ma fallisce nei pre-commit hook? Di solito il problema è l’isolamento dell’ambiente. Pre-commit esegue gli hook in ambienti isolati che non vedono i pacchetti installati del tuo progetto.
Risolvi puntando l’hook al tuo ambiente virtuale:
Errori inaspettati in modalità strict
Hai attivato la modalità strict e vedi all’improvviso migliaia di errori? Niente panico. È normale. La modalità strict richiede annotazioni di tipo complete. Parti da basic o standard, aggiungi annotazioni gradualmente e abilita strict solo sui moduli completamente tipizzati.
Usa commenti per file per mantenere il codice legacy in una modalità permissiva:
Questo ti permette di applicare controlli rigorosi al codice nuovo mentre migri gradualmente quello vecchio.
Oltre al troubleshooting, ecco alcune strategie per rendere l’esperienza con Pyright più fluida fin da subito.
Best practice per usare Pyright
Dopo aver lavorato con Pyright su diversi progetti, ho imparato alcune cose che ne facilitano l’adozione. Adottare queste best practice di coding garantisce che il type checking resti un aiuto, non un ostacolo.
Inizia con la modalità standard. Come detto, intercetta bug reali senza richiedere annotazioni complete. Potrai sempre inasprire le regole in seguito.
Fissa la versione di Pyright. Pyright rilascia spesso nuove versioni e a volte le nuove rilasciano segnalazioni su codice che prima passava. In CI, un
pip install pyrightnon fissato può causare fallimenti del build il lunedì mattina per release uscite nel weekend. Ci sono passato. Non è divertente.Correggi gli errori in modo incrementale. Non provare a eliminare 10.000 errori in una volta. Usa l’array
strictper applicare controlli severi solo a directory specifiche:Usa presto i file di configurazione. Anche per progetti piccoli, una configurazione esplicita evita sorprese. Dedica cinque minuti a documentare la tua versione di Python, il percorso dell’ambiente virtuale e il livello di rigore scelto. Il te del futuro ti ringrazierà.
Non puntare alla perfezione subito. Usa
# pyright: ignoreliberamente all’inizio. Segna così il debito tecnico in modo visibile, da ripulire nel tempo senza bloccare i progressi. Il meglio è nemico del bene, soprattutto quando adotti nuovi strumenti.