Tools and Workflows for Python Development

Gestione degli Ambienti di Sviluppo Python, il Controllo di Versione e le Metodologie Operative Moderne
Sezione intitolata âGestione degli Ambienti di Sviluppo Python, il Controllo di Versione e le Metodologie Operative ModerneâIl presente documento si prefigge lo scopo di fornire unâanalisi esaustiva, rigorosa e dettagliata concernente le metodologie standardizzate e le strumentazioni di nuova generazione per la configurazione, lo sviluppo e la distribuzione di progetti software basati sul linguaggio Python. Saranno oggetto di disamina approfondita i meccanismi intrinseci agli ambienti virtuali (venv e conda), le strategie di risoluzione delle dipendenze (pip, pipx), lâintegrazione stretta con i sistemi di controllo versione (Git/GitHub) e lâadozione di gestori di pacchetti avanzati (uv). Lâobiettivo ultimo è lâottimizzazione delle prestazioni, la garanzia della riproducibilitĂ deterministica degli ambienti e la mitigazione dei rischi derivanti da una gestione approssimativa dellâecosistema software.
-
Fondamenti Teorici: Isolamento delle dipendenze e architettura del software
Nellâambito dellâingegneria del software orientata al linguaggio Python, la gestione delle dipendenze non costituisce un mero dettaglio accessorio, bensĂŹ si configura come pilastro architetturale imprescindibile per la stabilitĂ del sistema. A differenza dei linguaggi compilati (quali C++ o Go), i quali operano mediante il collegamento statico delle librerie producendo binari autosufficienti, lâinterprete Python risolve le importazioni in fase di esecuzione (runtime). Esso procede alla ricerca dei moduli interrogando sequenzialmente i percorsi definiti nella variabile
sys.path(derivata dalla variabile dâambientePYTHONPATHe dalle configurazioni di installazione). Tale dinamica comporta che la presenza di versioni multiple di una medesima libreria, o lâaggiornamento indiscriminato di un pacchetto condiviso, possa innescare conflitti di dipendenze (c.d. dependency hell), con conseguenti malfunzionamenti, errori di importazione e comportamenti imprevedibili dellâapplicazione.
1.1 Analisi delle criticitĂ inerenti alle installazioni a livello di sistema
Sezione intitolata â1.1 Analisi delle criticitĂ inerenti alle installazioni a livello di sistemaâQualora si proceda allâinstallazione di un pacchetto a livello di sistema (comunemente definita âglobaleâ), esso viene collocato nella directory site-packages condivisa dallâinterprete principale del sistema operativo. Tale modus operandi risulta insostenibile e potenzialmente distruttivo per due ordini di ragioni critiche:
-
Conflitto di versioni (c.d. Dependency Hell): Nellâipotesi in cui il Progetto A richieda la libreria
pandas v1.0per funzionalitĂ deprecate e, contestualmente, il Progetto B necessiti dipandas v2.0per nuove implementazioni, risulta impossibile soddisfare simultaneamente ambedue i requisiti allâinterno di un unico ambiente globale. Lâaggiornamento di una libreria a beneficio di un progetto comprometterebbe inevitabilmente lâintegritĂ funzionale dellâaltro, generando errori a runtime spesso di difficile diagnosi. -
Compromissione dellâintegritĂ e permessi di sistema: Sui sistemi operativi basati su Unix (Linux/macOS), lâinstallazione globale richiede sovente privilegi amministrativi (
sudo). Tale pratica comporta il rischio concreto di sovrascrittura o alterazione di librerie critiche, essenziali per il corretto funzionamento del sistema operativo medesimo (molti strumenti di sistema, comednfoapt, dipendono da specifiche versioni di librerie Python). Al fine di prevenire tali scenari, le recenti distribuzioni Linux hanno adottato la PEP 668, la quale impedisce attivamente apipdi modificare lâambiente gestito esternamente, imponendo di fatto lâuso di ambienti virtuali.
1.2 La soluzione mediante ambienti virtuali
Sezione intitolata â1.2 La soluzione mediante ambienti virtualiâUn ambiente virtuale (virtual environment) si definisce come una struttura di directory autocontenuta e isolata, la quale opera quale installazione Python indipendente. Da un punto di vista tecnico, essa comprende:
-
Una replica (o, piĂš frequentemente nei sistemi POSIX, un collegamento simbolico) dellâeseguibile binario dellâinterprete Python.
-
Il file di configurazione
pyvenv.cfg, il quale istruisce lâinterprete sulla locazione della âhomeâ dellâambiente, modificando dinamicamente il prefisso di sistema (sys.prefix). -
Una propria directory
site-packagesinizialmente vuota, destinata a ospitare le librerie di terze parti specifiche per quel determinato contesto. -
Script di attivazione preposti alla modifica dinamica delle variabili dâambiente della shell utente.
Tale architettura garantisce un disaccoppiamento totale: le dipendenze afferenti al Progetto A risiedono esclusivamente nella relativa directory .venv, risultando pertanto invisibili e ininfluenti rispetto al Progetto B e rispetto allâinterprete di sistema.
1.3 Anatomia strutturale del file system di progetto
Sezione intitolata â1.3 Anatomia strutturale del file system di progettoâAl fine di concretizzare i concetti esposti e fornire un riferimento visivo per lâorganizzazione degli artefatti, si presentano di seguito gli schemi strutturali raccomandati. Una corretta segregazione tra codice sorgente, configurazione dellâambiente e meta-dati del controllo versione è condizione necessaria per la manutenibilitĂ del software.
Modello A: Architettura standard (venv + requirements.txt)
Sezione intitolata âModello A: Architettura standard (venv + requirements.txt)âQuesta struttura riflette il workflow classico descritto nella PEP 405.
progetto_standard/ âââ .git/ # Directory di sistema del versionamento (Gestita da Git) âââ .gitignore # Direttive di esclusione (CRUCIALE: deve contenere .venv/) âââ .venv/ # Ambiente Virtuale locale (IGNORATO da Git) â âââ bin/ # (o Scripts/ su Windows) Contiene l'interprete Python isolato â âââ lib/ # Contiene le librerie site-packages âââ src/ # Directory radice del codice sorgente (Package Python) â âââ __init__.py â âââ main.py âââ requirements.txt # Manifesto delle dipendenze (Output di pip freeze) âââ README.md # Documentazione di alto livello e istruzioni di setupModello B: Architettura moderna (uv + pyproject.toml)
Sezione intitolata âModello B: Architettura moderna (uv + pyproject.toml)âQuesta struttura riflette lâadozione di toolchain moderne conformi alla PEP 518, dove la configurazione è centralizzata e dichiarativa.
progetto_moderno/âââ .git/ # Directory di sistema del versionamentoâââ .gitignore # Direttive di esclusione (Gestito automaticamente da uv)âââ .python-version # Vincolo della versione Python (es. 3.12)âââ .venv/ # Ambiente Virtuale (Gestito ed effimero per uv)âââ src/ # Codice sorgenteâ âââ main.pyâââ pyproject.toml # Definizione dichiarativa del progetto e delle dipendenzeâââ uv.lock # File di lock deterministico cross-platform (DA VERSIONARE)âââ README.md # DocumentazioneSi noti come, in ambedue i modelli, la directory .venv sia rigorosamente presente nel file system locale per lâesecuzione, ma sistematicamente esclusa dal repository remoto tramite .gitignore.
2. Il Protocollo operativo standardizzato: venv e pip
Sezione intitolata â2. Il Protocollo operativo standardizzato: venv e pipâIl presente approccio costituisce lo standard de facto, integrato nel linguaggio Python (in conformitĂ alla PEP 405), ed è supportato nativamente senza la necessitĂ di installazione di strumenti ausiliari, garantendo la massima compatibilitĂ trasversale.
2.1 Procedura di creazione dellâambiente
Sezione intitolata â2.1 Procedura di creazione dellâambienteâLa best practice consolidata prescrive la creazione dellâambiente virtuale allâinterno della directory radice (root) del progetto. La denominazione convenzionale adottata è .venv. Lâutilizzo del punto iniziale persegue molteplici finalitĂ ergonomiche e funzionali: occulta la directory nei file system Unix-like, previene lâingombro visivo nellâesplorazione dei file e garantisce il riconoscimento automatico da parte dei principali Ambienti di Sviluppo Integrato (IDE), quali VS Code o PyCharm, che provvederanno automaticamente a selezionare lâinterprete corretto.
Comando di creazione (Specifiche Tecniche):
# Ambiente Windows# Il flag '-m' invoca l'esecuzione del modulo della libreria standard come scriptpython -m venv .venv# Ambiente macOS / Linux# Ă sovente necessario specificare esplicitamente l'interprete python3 per disambiguazionepython3 -m venv .venv2.2 Attivazione e modifica della variabile PATH
Sezione intitolata â2.2 Attivazione e modifica della variabile PATHâLâattivazione non deve essere intesa come un processo arcano o una modifica permanente, bensĂŹ come una alterazione temporanea delle variabili dâambiente della shell in uso per la sessione corrente. Nello specifico, lo script di attivazione antepone (prepends) il percorso della directory bin (o Scripts in ambiente Windows) dellâambiente virtuale alla variabile $PATH del sistema. Inoltre, imposta la variabile VIRTUAL_ENV per indicare agli strumenti attivi la presenza dellâambiente.
Conseguentemente, allâimmissione dei comandi python o pip, il sistema operativo darĂ prioritĂ agli eseguibili dellâambiente virtuale rispetto a quelli di sistema, intercettando le chiamate.
-
Windows (PowerShell):
Finestra del terminale .venv\Scripts\Activate.ps1# Qualora si riscontrino errori relativi alle policy di esecuzione (ExecutionPolicy), si impone il comando:# Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -
Windows (CMD):
Finestra del terminale .venv\Scripts\activate.bat -
macOS / Linux (Bash/Zsh):
Finestra del terminale source .venv/bin/activate
Per cessare le operazioni nellâambiente e ripristinare il $PATH originario, è sufficiente invocare il comando deactivate, che rimuove le modifiche apportate alla sessione.
2.3 Gestione della pacchettizzazione mediante pip
Sezione intitolata â2.3 Gestione della pacchettizzazione mediante pipâpip (Pip Installs Packages) si configura come il gestore di pacchetti ufficiale e lo strumento primario per lâinterazione con il Python Package Index (PyPI). A seguito dellâattivazione dellâambiente, ogni operazione di installazione o rimozione risulta rigorosamente confinata allâambito locale.
-
Verifica dellâAmbiente: Preliminarmente allâinstallazione, è doveroso verificare quale istanza di
pipsia in uso per evitare errori di contesto:Finestra del terminale which pip # Sistemi Linux/macOSwhere pip # Sistemi Windows (cmd)where.exe pip # Sistemi Windows (PowerShell)# L'output deve necessariamente puntare all'interno della directory .venv/bin o .venv\Scripts -
Installazione dei Pacchetti:
Finestra del terminale pip install pandas requests matplotlib -
Congelamento delle Dipendenze (Freezing):
Al fine di garantire la riproducibilitĂ deterministica dellâambiente su macchine terze, è imperativo generare una âistantaneaâ precisa delle librerie installate e delle relative versioni.
Finestra del terminale pip freeze > requirements.txtIl file
requirements.txtconterrĂ direttive esplicite qualipandas==2.0.3, assicurando che chiunque proceda allâinstallazione del progetto ottenga la medesima versione, prevenendo anomalie derivanti da aggiornamenti futuri non testati. Tuttavia, si noti chepip freezeelenca linearmente tutte le dipendenze (dirette e transitive) senza distinzione, il che può complicare la manutenzione a lungo termine rispetto ai moderni file di lock. -
Ripristino dellâAmbiente:
Allorquando un nuovo sviluppatore o un sistema di Continuous Integration (CI) effettui la clonazione del progetto, dovrĂ attenersi alla seguente procedura per replicare lâambiente operativo:
Finestra del terminale # ambiente linux/macOS# 1. Creazione dell'ambiente virtuale ex novopython3 -m venv .venv# 2. Attivazione del contestosource .venv/bin/activate# 3. Installazione massiva delle dipendenzepip install -r requirements.txtFinestra del terminale # ambiente Windows (PowerShell)# 1. Creazione dell'ambiente virtuale ex novopython -m venv .venv# 2. Attivazione del contesto.\.venv\Scripts\Activate.ps1# 3. Installazione massiva delle dipendenzepip install -r requirements.txt
3. LâEcosistema alternativo: Anaconda e la gestione dei binari scientifici
Sezione intitolata â3. LâEcosistema alternativo: Anaconda e la gestione dei binari scientificiâParallelamente allâecosistema standard di Python, sussiste un ambiente distinto denominato Anaconda (o nella sua variante minimale, Miniconda). Tale ecosistema, sebbene basato sul medesimo linguaggio, differisce radicalmente nella filosofia di gestione dei pacchetti e degli ambienti, risultando lo standard de facto per le discipline della Data Science, del Machine Learning e del Calcolo Scientifico.
3.1 Divergenze architetturali: gestione binaria, posizionamento e Python
Sezione intitolata â3.1 Divergenze architetturali: gestione binaria, posizionamento e PythonâLa differenza sostanziale tra pip/venv e conda risiede in tre aspetti fondamentali:
-
Natura dei pacchetti:
-
Pip (Source/Wheels): Installa pacchetti Python. Se una libreria richiede estensioni C/Fortran, tenta di compilare il sorgente o scarica una âwheelâ precompilata (che però potrebbe non includere tutte le dipendenze di sistema).
-
Conda (Binari Puri): Installa binari precompilati completi di tutte le dipendenze di sistema (driver CUDA, librerie MKL, compilatori GCC), eliminando la necessitĂ di compilazione locale.
-
-
Posizionamento (locale vs centralizzato):
-
Standard (
venv): Crea lâambiente localmente dentro la cartella del progetto (es../.venv). Ă effimero e legato allâesistenza della cartella di progetto. -
Conda: Crea gli ambienti in una directory globale centralizzata (solitamente
~/anaconda3/envs/oC:\Users\Utente.conda\envs). Gli ambienti sono disaccoppiati dal codice sorgente e sono richiamabili ovunque nel sistema tramite il loro nome.
-
-
Gestione dellâInterprete:
-
Standard (
venv): à vincolato alla versione di Python base installata nel sistema. Non può creare un ambiente Python 3.8 se nel sistema è installato solo Python 3.11. -
Conda: Tratta Python come un qualsiasi altro pacchetto. Permette di installare versioni multiple e discordanti di Python (es. 3.7, 3.10, 3.12) senza toccare il sistema operativo.
-
3.2 Protocollo operativo Conda
Sezione intitolata â3.2 Protocollo operativo CondaâDi seguito si illustrano i comandi essenziali per la gestione del ciclo di vita di un ambiente Conda. Si noti come lâattivazione avvenga tramite nome e non tramite percorso.
Creazione dellâAmbiente:
# Sintassi: conda create --name <nome_ambiente> python=<versione>conda create --name progetto_ds python=3.9Attivazione e gestione:
# Attivazione (Cross-platform) - Nota: si usa il NOME, non il percorsoconda activate progetto_ds
# Installazione Pacchetti (dal repository Anaconda o conda-forge)conda install numpy pandas matplotlib scikit-learn
# Esportazione dell'ambiente (equivalente a requirements.txt ma piĂš completo)conda env export > environment.yml
# Ricostruzione dell'ambiente da file YAMLconda env create -f environment.yml3.3 Criteri decisionali per lâadozione
Sezione intitolata â3.3 Criteri decisionali per lâadozioneâLa scelta tra lâapproccio standard (venv) e Conda deve essere guidata dalle specifiche esigenze del progetto:
-
Si raccomanda lâuso di Conda/Miniconda se:
-
Si opera in ambiti scientifici (Data Science, AI) ove le dipendenze da librerie C/Fortran/CUDA sono pervasive.
-
Si utilizza il sistema operativo Windows, ove la compilazione di estensioni C risulta complessa.
-
Si necessita di cambiare frequentemente la versione dellâinterprete Python tra diversi progetti.
-
-
Si raccomanda lâuso di
venv(ouv) se:-
Si sviluppano applicazioni Web (Django, FastAPI) destinate al deployment in container Docker o su cloud (PaaS).
-
Si predilige un ambiente leggero e strettamente aderente agli standard della Python Software Foundation.
-
Si opera su sistemi Linux/macOS ove la gestione dei compilatori è nativa.
-
4. Approfondimento tecnico: compilazione locale di dipendenze scientifiche (Caso Studio AI)
Sezione intitolata â4. Approfondimento tecnico: compilazione locale di dipendenze scientifiche (Caso Studio AI)âEsistono scenari avanzati in cui lâuso di Conda non è possibile o desiderabile (es. vincoli di licenza, necessitĂ di versioni bleeding-edge da Git, o integrazione in pipeline CI/CD standard). In questi casi, è necessario colmare il divario tra pip (che si aspetta compilatori presenti) e il sistema operativo.
Caso di Studio: Installazione di llama-cpp-python per lâesecuzione locale di LLM (Large Language Models) con accelerazione hardware. Questa libreria è un binding Python per llama.cpp (scritto in C++) e richiede tassativamente la compilazione locale per abilitare il supporto GPU (CUDA/Metal).
4.1 Prerequisiti della toolchain di compilazione
Sezione intitolata â4.1 Prerequisiti della toolchain di compilazioneâPrima di attivare il venv e lanciare pip, è imperativo preparare il sistema ospite con i compilatori C/C++ e gli header di Python.
Ambiente Linux (Ubuntu/Debian)
Sezione intitolata âAmbiente Linux (Ubuntu/Debian)âĂ necessario installare il meta-pacchetto build-essential e, crucialmente, gli header di sviluppo di Python (python3-dev), senza i quali la compilazione fallirĂ con errore Python.h: No such file.
# Aggiornamento e installazione toolchainsudo apt updatesudo apt install build-essential python3-dev cmake
# Se si usa GPU NVIDIA, assicurarsi che il CUDA Toolkit sia installato (comando nvcc)nvcc --versionAmbiente Windows
Sezione intitolata âAmbiente WindowsâWindows non possiede compilatori nativi nel PATH. Ă necessario installare Visual Studio Build Tools (da non confondere con VS Code).
-
Scaricare lâinstaller dal sito Microsoft.
-
Selezionare il workload âSviluppo desktop con C++â.
-
Assicurarsi che siano selezionati: âMSVC compilerâ, âWindows 10/11 SDKâ e âCMake tools for Windowsâ.
4.2 Il Processo di compilazione con pip
Sezione intitolata â4.2 Il Processo di compilazione con pipâUna volta predisposti i compilatori, la procedura di installazione differisce da quella standard perchĂŠ dobbiamo passare istruzioni al compilatore sottostante (CMake) tramite variabili dâambiente.
-
Creazione e attivazione venv
Finestra del terminale # Windowspython -m venv .venv.venv\Scripts\activateFinestra del terminale # Linux/macOSpython3 -m venv .venvsource .venv/bin/activate -
Installazione delle dipendenze di build
Il pacchetto richiede scikit-build-core o cmake python-side per orchestrare la compilazione.
Finestra del terminale pip install --upgrade pip setuptools wheel cmake scikit-build-core -
Compilazione e Installazione (Linux con CUDA)
Per abilitare lâaccelerazione GPU, impostiamo CMAKE_ARGS. Usiamo lâopzione
--no-binaryper forzare pip a ignorare eventuali wheel precompilate (che solitamente sono solo CPU) e compilare da zero.Finestra del terminale # Imposta le variabili per abilitare CuBLAS (backend NVIDIA)CMAKE_ARGS="-DLLAMA_CUBLAS=on" pip install llama-cpp-python --upgrade --force-reinstall --no-binary llama-cpp-python -
Compilazione e Installazione (Windows con CUDA)
Su PowerShell, la sintassi per le variabili dâambiente differisce:
Finestra del terminale # Imposta le variabili per abilitare CuBLAS (backend NVIDIA)$env:CMAKE_ARGS = "-DLLAMA_CUBLAS=on"pip install llama-cpp-python --upgrade --force-reinstall --no-binary llama-cpp-python
4.3 Verifica dellâartefatto compilato
Sezione intitolata â4.3 Verifica dellâartefatto compilatoâAl termine, pip avrĂ generato un binario .so (Linux) o .pyd (Windows) specificamente ottimizzato per lâhardware locale, collegato (linked) staticamente o dinamicamente alle librerie CUDA di sistema.
4.4 Integrazione ed esecuzione in codice Python
Sezione intitolata â4.4 Integrazione ed esecuzione in codice PythonâA compilazione avvenuta con successo, la libreria è importabile nel contesto Python come un normale pacchetto. Di seguito si riporta un esempio minimale di inferenza che sfrutta lâaccelerazione hardware configurata.
from llama_cpp import Llama
# Inizializzazione del modello# Nota: Ă necessario scaricare un modello in formato GGUF (es. da HuggingFace)# n_gpu_layers=-1 sposta tutti i layer sulla GPU se VRAM sufficientellm = Llama( model_path="./models/mistral-7b-instruct-v0.2.Q4_K_M.gguf", n_gpu_layers=-1, verbose=True)
# Esecuzione dell'inferenzaoutput = llm( "Q: Qual è la capitale della Francia? A: ", max_tokens=32, stop=["Q:", "\n"], echo=True)
print(output)4.5 Analisi comparativa: lâapproccio âZero-Compilationâ di Conda
Sezione intitolata â4.5 Analisi comparativa: lâapproccio âZero-Compilationâ di CondaâAl fine di offrire una prospettiva completa e in accordo con i principi di efficienza operativa, si illustra come la medesima libreria possa essere integrata sfruttando lâecosistema Conda, eliminando la necessitĂ di compilazione locale.
Grazie allâarchitettura basata su binari pre-compilati (descritta nella Sezione 3.1), i manutentori di repository come conda-forge provvedono a generare artefatti software giĂ compilati e ottimizzati per le diverse combinazioni di hardware (CPU/GPU) e sistemi operativi.
Scenario Alternativo:
In luogo della complessa procedura di configurazione dei build tools (VS C++, CMake, NVCC) descritta nei paragrafi 4.1-4.3, lâadozione di Conda riduce lâintero processo a una singola istruzione dichiarativa, delegando al package manager la risoluzione delle dipendenze di basso livello.
# 1. Creazione di un ambiente dedicato (Best Practice)conda create --name ai_env python=3.10
# 2. Attivazione dell'ambienteconda activate ai_env
# 3. Installazione del pacchetto precompilato# Il canale 'conda-forge' fornisce binari aggiornati.# Nota: Conda gestirĂ automaticamente le dipendenze di runtime.conda install -c conda-forge llama-cpp-pythonNota Tecnica: Sebbene questo approccio offra unâimmediata operativitĂ (âIt just worksâ), potrebbe talvolta fornire versioni leggermente meno recenti rispetto al codice sorgente disponibile su GitHub, o configurazioni generiche non ottimizzate per set di istruzioni CPU specifici (es. AVX512) che invece una compilazione locale mirata potrebbe sfruttare. Tuttavia, per la maggioranza degli scenari applicativi, il risparmio in termini di tempo di configurazione e manutenzione rende Conda la scelta pragmatica preferibile.
5. Lâecosistema Interactive Computing: Jupyter Notebooks e Gestione dei Kernel
Sezione intitolata â5. Lâecosistema Interactive Computing: Jupyter Notebooks e Gestione dei KernelâLâuso di notebook interattivi (file .ipynb) rappresenta uno standard industriale nella Data Science e nellâAI. Tuttavia, lâintegrazione tra Jupyter (lâambiente di interfaccia) e gli ambienti virtuali (dove risiedono le librerie) è spesso fonte di confusione. Ă fondamentale comprendere il concetto di Kernel.
5.1 Architettura disaccoppiata: Interfaccia vs Kernel
Sezione intitolata â5.1 Architettura disaccoppiata: Interfaccia vs KernelâUn errore comune è pensare che, avviando jupyter notebook allâinterno di un ambiente virtuale attivo, il notebook usi automaticamente quellâambiente. Non è sempre cosĂŹ. Jupyter è progettato con unâarchitettura client-server disaccoppiata:
-
LâInterfaccia (Frontend): Ă lâapplicazione web (JupyterLab o Jupyter Notebook) che mostra il codice e i grafici.
-
Il Kernel (Backend): Ă il processo separato che esegue effettivamente il codice Python.
Ă possibile (e frequente) avere lâinterfaccia Jupyter installata nellâambiente âbaseâ o tramite pipx, mentre i vari notebook eseguono codice in diversi ambienti virtuali (venv o conda) configurati come kernel distinti.
5.2 Integrazione con ambienti standard (venv)
Sezione intitolata â5.2 Integrazione con ambienti standard (venv)âPer rendere visibile un ambiente virtuale standard (venv) a Jupyter, è necessario installare al suo interno il pacchetto ipykernel e registrarlo manualmente.
Procedura Operativa:
# 1. Attivazione del venv di progetto# in linux/macOSsource .venv/bin/activate# oppure in Windows (PowerShell).venv\Scripts\Activate.ps1
# 2. Installazione del supporto kernelpip install ipykernel
# 3. Registrazione del kernel (User-level)# --name: identificativo interno (no spazi)# --display-name: nome visibile nel menu di Jupyterpython -m ipykernel install --user --name=mio_progetto_env --display-name "Python (Mio Progetto)"Dopo questa operazione, nel menu âKernelâ -> âChange Kernelâ di Jupyter comparirĂ la voce âPython (Mio Progetto)â, permettendo di eseguire il codice usando le librerie di quel specifico venv.
5.3 Integrazione avanzata con Conda (nb_conda_kernels)
Sezione intitolata â5.3 Integrazione avanzata con Conda (nb_conda_kernels)âLâecosistema Conda offre un livello di automazione superiore per la gestione dei kernel, eliminando la necessitĂ di registrazione manuale descritta sopra.
Il pacchetto nb_conda_kernels:
Installando questa estensione nellâambiente dove risiede Jupyter (solitamente lâambiente base o un ambiente dedicato agli strumenti), essa rileverĂ automaticamente tutti gli altri ambienti Conda presenti nel sistema che abbiano il pacchetto ipykernel installato.
Workflow consigliato (Conda):
-
Ambiente âJupyterâ (Contenitore):
Si crea un ambiente dedicato per lâinterfaccia grafica e le estensioni.
Finestra del terminale conda create --name jupyter_env jupyterlab nb_conda_kernels -
Ambiente âProgettoâ (Esecuzione):
Si crea lâambiente di lavoro specifico per lâanalisi dati.
Finestra del terminale conda create --name analisi_dati python=3.9 pandas scikit-learn ipykernelNota: Ă cruciale installare
ipykernelanche nellâambiente target. -
Utilizzo:
Avviando Jupyter dallâambiente contenitore:
Finestra del terminale conda activate jupyter_envjupyter labLa dashboard mostrerĂ automaticamente un kernel denominato
Python [conda env:analisi_dati]. Non è richiesta alcuna registrazione manuale: creando nuovi ambienti Conda (conipykernel), questi appariranno dinamicamente nella lista.
6. Gestione della strumentazione globale: pipx e uvx
Sezione intitolata â6. Gestione della strumentazione globale: pipx e uvxâMentre venv e conda sono progettati per isolare le librerie necessarie allo sviluppo di un progetto (importabili nel codice), esiste una classe di strumenti Python destinati allâuso come applicazioni da riga di comando (CLI) stand-alone, da richiamare ovunque nel sistema.
6.1 Errore metodologico comune e architettura di pipx
Sezione intitolata â6.1 Errore metodologico comune e architettura di pipxâLâinstallazione di strumenti come black o poetry mediante pip install --user (globale) espone al rischio di conflitti di dipendenze (e.g., due tool richiedono versioni diverse della stessa libreria). pipx risolve questo problema mediante una rigorosa segregazione architetturale.
Dove vengono installati i pacchetti?
A differenza di pip, che installa tutto in unâunica directory site-packages condivisa, pipx adotta la seguente struttura:
-
Ambienti Virtuali Dedicati: Per ogni applicazione installata,
pipxcrea automaticamente un ambiente virtuale separato. La posizione predefinita di questi ambienti è:-
Linux/macOS:
~/.local/pipx/venvs/ -
Windows:
%USERPROFILE%.local\pipx\venvs\
-
-
Esposizione dei binari (Shim/Symlink): I soli file eseguibili (binari) vengono collegati simbolicamente o tramite âshimâ in una directory inclusa nel
$PATHdellâutente (tipicamente~/.local/bin), rendendoli invocabili da terminale senza dover attivare alcun ambiente.
In sintesi: ogni tool ha il suo ambiente privato, ma lâutente percepisce un unico comando globale.
6.2 Tassonomia dei casi dâuso avanzati
Sezione intitolata â6.2 Tassonomia dei casi dâuso avanzatiâLâadozione di pipx è fortemente raccomandata per le seguenti categorie di software:
A. Gestori di pacchetti e dipendenze (Poetry, PDM, Pipenv)
Sezione intitolata âA. Gestori di pacchetti e dipendenze (Poetry, PDM, Pipenv)âInstallare poetry tramite pip globale può causare conflitti se un progetto richiede librerie che poetry stesso usa internamente.
-
Comando:
pipx install poetry -
Beneficio: Poetry gira nel suo ambiente isolato. Se si aggiorna Poetry, non si rischia di rompere altri tool.
B. Strumenti di Code Quality e Formatting (Black, Ruff, Flake8)
Sezione intitolata âB. Strumenti di Code Quality e Formatting (Black, Ruff, Flake8)âQuesti strumenti devono essere eseguiti su molteplici progetti diversi. Installarli in ogni singolo venv di progetto è ridondante; installarli globalmente è rischioso.
-
Comando:
pipx install black -
Beneficio: Si può digitare
black .in qualsiasi cartella del sistema.pipxgarantisce cheblackabbia sempre le sue dipendenze soddisfatte indipendentemente dal progetto su cui sta lavorando.
C. Utility di Sistema e Networking (Httpie, Glances, YouTube-DL)
Sezione intitolata âC. Utility di Sistema e Networking (Httpie, Glances, YouTube-DL)âApplicazioni che sostituiscono tool di sistema (come curl o top).
-
Comando:
pipx install httpie -
Uso: Esecuzione del comando
httpohttpsdirettamente da terminale per testare API.
D. Ambienti Jupyter Isolati
Sezione intitolata âD. Ambienti Jupyter IsolatiâPer evitare di installare Jupyter in ogni progetto, si può usare pipx per gestire il core di Jupyter e collegare i kernel dei vari venv.
- Comando:
pipx install jupyterlab
6.3 FunzionalitĂ avanzata: Dependency Injection (pipx inject)
Sezione intitolata â6.3 FunzionalitĂ avanzata: Dependency Injection (pipx inject)âTalvolta unâapplicazione isolata in pipx necessita di librerie aggiuntive (plugin) per funzionare. PoichĂŠ lâambiente è chiuso, non è possibile usare pip install. Si usa inject.
-
Scenario: Si vuole usare
mkdocs(generatore di documentazione) con il temamkdocs-material. -
Procedura:
-
Installare lâapp principale:
pipx install mkdocs -
Iniettare la dipendenza nello stesso ambiente:
pipx inject mkdocs mkdocs-material
-
6.4 Protocollo Operativo
Sezione intitolata â6.4 Protocollo Operativoâ# 1. Installazione di pipx (operazione una tantum)python -m pip install --user pipxpython -m pipx ensurepath # Aggiunge ~/.local/bin al PATH
# 2. Installazione di un tool (es. il linter ruff)pipx install ruff# Output: installed package ruff 0.1.0, Python 3.10.12# These apps are now globally available:# - ruff
# 3. Aggiornamento di tutti i tool installatipipx upgrade-all
# 4. Esecuzione Ephemera (Senza installazione)# Scarica, esegue e poi cancella l'ambiente temporaneo. Utile per test rapidi.pipx run cowsay "Pipx è architetturalmente superiore"6.5 Approccio moderno allâesecuzione di tool: uvx
Sezione intitolata â6.5 Approccio moderno allâesecuzione di tool: uvxâCon lâintroduzione di uv, lâecosistema Python dispone di un meccanismo estremamente performante per lâesecuzione di strumenti CLI in modalitaâ effimera: uvx. Dal punto di vista semantico, uvx eâ un alias esatto di uv tool run; in altri termini, i seguenti comandi sono equivalenti:
uvx ruff check .uv tool run ruff check .Lâelemento architetturalmente rilevante consiste nel fatto che uvx non installa stabilmente il tool nel progetto e non contamina lâambiente virtuale corrente. Invece, crea o riusa un ambiente isolato nella cache di uv, esegue il comando richiesto e tratta tale ambiente come un artefatto temporaneo e ricreabile, cioeâ privo di valore permanente. Se la cache viene rimossa, uvx ricostruiraâ automaticamente lâambiente alla successiva esecuzione.
Questo modello lo rende particolarmente adatto per:
-
esecuzioni occasionali di formatter, linter e generatori di progetto;
-
test rapidi di utility CLI senza installazione persistente;
-
uso di versioni temporanee o specifiche di un tool;
-
ambienti CI/CD in cui si desidera evitare installazioni globali permanenti.
6.6 Analisi comparativa: uvx vs pipx vs uv run
Sezione intitolata â6.6 Analisi comparativa: uvx vs pipx vs uv runâPoicheâ nella pratica questi strumenti vengono spesso confusi, eâ opportuno distinguerne con rigore i ruoli:
| Strumento | Scopo primario | Persistenza | Relazione col progetto corrente |
|---|---|---|---|
pipx install | Installare tool CLI globali in ambienti isolati | Persistente | Nessuna integrazione col progetto |
pipx run | Eseguire una CLI in modo temporaneo | Effimera | Nessuna integrazione col progetto |
uvx | Eseguire tool Python in ambienti effimeri con cache ad alte prestazioni | Effimera/cached | Sempre isolato dal progetto |
uv run | Eseguire comandi nel contesto del progetto | Dipende dal progetto .venv | Integra dipendenze e lockfile del progetto |
La regola operativa puoâ essere formulata come segue:
-
usare
uvxquando il tool va eseguito come strumento esterno e non deve dipendere dal progetto; -
usare
uv runquando il tool deve vedere il package corrente, le dipendenze dichiarate nelpyproject.tomlo lâambiente lockato del repository; -
usare
uv tool installopipx installquando si vuole che il comando sia disponibile stabilmente nelPATH.
Un esempio chiarificatore:
-
uvx ruff check .eâ ideale per lanciare Ruff come utility esterna; -
uv run pytesteâ preferibile auvx pytest, poicheâ i test devono normalmente importare il codice del progetto e usare le sue dipendenze dichiarate.
6.7 Meccanica interna e gestione della cache
Sezione intitolata â6.7 Meccanica interna e gestione della cacheâQuando uvx esegue un tool, uv risolve il pacchetto richiesto, costruisce un ambiente dedicato e lo conserva nella cache globale. Tale cache ha finalitaâ prestazionali: evita di scaricare e reinstallare il medesimo tool a ogni invocazione. Tuttavia, la cache non equivale a installazione permanente.
Le implicazioni pratiche sono:
-
La prima esecuzione puoâ richiedere il download del pacchetto.
-
Le esecuzioni successive risultano normalmente molto piuâ rapide.
-
Se si esegue
uv cache clean, lâambiente del tool viene eliminato e verraâ ricreato al bisogno. -
Se un tool eâ giaâ stato installato con
uv tool install,uvxtende a usare quella versione installata, salvo richiesta esplicita di unâaltra versione o uso del flag--isolated.
Per ispezionare la cache di uv:
uv cache diruv cache sizePer forzare un comportamento senza cache:
uvx --no-cache ruff check .Tale opzione eâ utile in debugging, benchmarking o flussi altamente deterministici, ma riduce il vantaggio prestazionale della cache.
6.8 Sintassi operativa fondamentale di uvx
Sezione intitolata â6.8 Sintassi operativa fondamentale di uvxâA. Esecuzione basilare di un tool
Sezione intitolata âA. Esecuzione basilare di un toolâuvx ruff check .uvx black --check .uvx http --helpNel primo esempio uvx deduce che il comando ruff corrisponde al pacchetto Python ruff. Questa inferenza eâ corretta per molti tool, ma non per tutti.
B. Caso in cui nome del pacchetto e nome del comando differiscono
Sezione intitolata âB. Caso in cui nome del pacchetto e nome del comando differisconoâNon sempre il nome del package su PyPI coincide con lâeseguibile. Un caso classico eâ httpie, che espone i comandi http e https.
uvx --from httpie http GET https://example.orgIl flag --from permette di indicare esplicitamente quale pacchetto installare per ottenere il comando desiderato.
C. Richiesta di una versione esatta o dellâultima disponibile
Sezione intitolata âC. Richiesta di una versione esatta o dellâultima disponibileâPer riprodurre una specifica versione:
uvx ruff@0.6.9 --versionuvx pyright@1.1.390 --versionPer forzare lâuso dellâultima release disponibile e aggiornare la cache associata:
uvx ruff@latest check .Per vincoli piuâ complessi si usa --from:
uvx --from 'ruff>=0.6,<0.7' ruff check .uvx --from 'httpie>3,<4' http --versionD. Esecuzione con dipendenze aggiuntive o plugin
Sezione intitolata âD. Esecuzione con dipendenze aggiuntive o pluginâTalvolta il tool necessita di estensioni opzionali. In questo scenario, uvx supporta --with.
uvx --with mkdocs-material mkdocs serveuvx --with pytest-cov pytest --cov=srcIn tal modo il tool principale e le dipendenze supplementari vengono risolti nello stesso ambiente effimero. Questo pattern eâ particolarmente utile per ecosistemi plugin-based.
E. Uso di extras del pacchetto
Sezione intitolata âE. Uso di extras del pacchettoâSe il tool supporta extras dichiarati dal package, si puoâ ricorrere ancora a --from.
uvx --from 'mypy[faster-cache,reports]==1.13.0' mypy src --xml-report build/mypy-reportQuesto approccio eâ piuâ rigoroso rispetto allâinstallazione globale casuale di plugin, poicheâ rende esplicita lâintera superficie di dipendenze richiesta dal comando.
F. Esecuzione da sorgenti alternative (Git)
Sezione intitolata âF. Esecuzione da sorgenti alternative (Git)âuvx puoâ eseguire un tool direttamente da repository Git, tag, branch o commit.
uvx --from git+https://github.com/httpie/cli httpie --versionuvx --from git+https://github.com/httpie/cli@3.2.4 http --versionuvx --from git+https://github.com/httpie/cli@master http --versionQuesto eâ utile per testare:
-
una patch non ancora pubblicata su PyPI;
-
una release candidate;
-
una branch sperimentale di un tool.
6.9 Selezione dellâinterprete Python
Sezione intitolata â6.9 Selezione dellâinterprete PythonâOgni ambiente creato da uvx eâ associato a uno specifico interprete Python. Se necessario, eâ possibile richiedere una versione esplicita tramite --python.
uvx --python 3.10 ruff check .uvx --python 3.12 pyrightuvx --python 3.13 black .Questa capacitaâ risulta importante quando:
-
si desidera verificare la compatibilitaâ di un tool con una certa major/minor di Python;
-
il tool ha requisiti minimi non soddisfatti dal Python di sistema;
-
si vogliono uniformare gli ambienti operativi tra workstation e CI.
Inoltre, uvx puoâ essere usato perfino per eseguire un interprete Python isolato:
uvx pythonuvx python@3.12Si tratta di un meccanismo molto utile per test temporanei o per verificare rapidamente la disponibilitaâ di una determinata versione senza allestire manualmente un ambiente virtuale persistente.
6.10 Modalitaâ isolata, refresh e controllo del comportamento
Sezione intitolata â6.10 Modalitaâ isolata, refresh e controllo del comportamentoâSe un tool eâ giaâ installato in modo persistente con uv tool install, uvx puoâ riusarlo. Se peroâ si desidera ignorare ogni installazione persistente e forzare un ambiente autonomo, si usa --isolated.
uvx --isolated ruff --versionQuesto comportamento eâ utile per:
-
confrontare una versione installata con una effimera;
-
evitare interferenze con tool giaâ presenti nel sistema;
-
validare pipeline di build o documentazione in condizioni pulite.
Per forzare lâaggiornamento del contenuto cache-izzato:
uvx --refresh ruff check .uvx --refresh-package ruff ruff check .Per operare senza accesso alla rete, riusando solo cioâ che eâ giaâ presente localmente:
uvx --offline ruff check .Questa modalitaâ eâ appropriata in contesti air-gapped o per verificare la completezza della cache in pipeline riproducibili.
6.11 Casi dâuso avanzati e scenari reali
Sezione intitolata â6.11 Casi dâuso avanzati e scenari realiâA. Formattazione o linting occasionale di repository eterogenei
Sezione intitolata âA. Formattazione o linting occasionale di repository eterogeneiâSe si lavora su molteplici repository ma non si desidera installare permanentemente ogni tool:
uvx ruff check .uvx black .uvx pyrightQuesto flusso riduce lâoverhead di setup e impedisce la proliferazione di installazioni globali disallineate.
B. Generazione di documentazione con plugin opzionali
Sezione intitolata âB. Generazione di documentazione con plugin opzionaliâuvx --with mkdocs-material mkdocs buildCaso ideale quando si vuole generare documentazione una tantum senza dover mantenere un ambiente locale dedicato al solo tool di build.
C. Test rapido di client HTTP e strumenti CLI di rete
Sezione intitolata âC. Test rapido di client HTTP e strumenti CLI di reteâuvx --from httpie http GET https://api.github.com/repos/astral-sh/uvQuesto approccio eâ utile per demo in aula, troubleshooting API o test manuali veloci.
D. Esecuzione di tool sperimentali o non ancora adottati stabilmente
Sezione intitolata âD. Esecuzione di tool sperimentali o non ancora adottati stabilmenteâuvx cookiecutter --helpuvx copier --helpuvx hatch --helpPrima di scegliere se adottare un tool nel workflow stabile, eâ possibile valutarlo senza installazione persistente.
E. Tooling in CI/CD o script di bootstrap
Sezione intitolata âE. Tooling in CI/CD o script di bootstrapâuvx ruff check .uvx pytest --versionuvx --from 'mypy==1.13.0' mypy srcIn pipeline temporanee, uvx permette di evitare configurazioni globali permanenti e rende esplicito quale comando viene richiesto in ogni step.
6.12 Criteri decisionali: quando scegliere uvx
Sezione intitolata â6.12 Criteri decisionali: quando scegliere uvxâSi raccomanda uvx quando:
-
il tool eâ usato saltuariamente o in modo non continuativo;
-
si desidera evitare installazioni globali permanenti;
-
eâ utile provare versioni diverse dello stesso strumento;
-
si vuole unâesecuzione rapida, isolata e facilmente ripetibile.
Si raccomanda invece uv tool install o pipx install quando:
-
il comando deve essere sempre disponibile nel
PATHsenza prefissouvx; -
altri script o processi esterni si aspettano che il binario sia installato stabilmente;
-
si vuole gestire il ciclo di vita del tool come installazione persistente.
Si raccomanda uv run, e non uvx, quando:
-
il comando deve operare dentro il contesto del progetto;
-
il tool deve importare il package locale;
-
il risultato deve essere coerente con
pyproject.toml,uv.locke.venvdel repository.
In sintesi, uvx rappresenta la soluzione di nuova generazione per il concetto di âtool eseguito al bisognoâ: unisce lâisolamento tipico di pipx run alla velocitaâ, alla cache globale e alla coerenza ecosistemica offerte da uv.
7. Integrazione con i Sistemi di Controllo Versione (Git e GitHub)
Sezione intitolata â7. Integrazione con i Sistemi di Controllo Versione (Git e GitHub)âIl controllo di versione costituisce un requisito essenziale per qualsiasi progetto software moderno; tuttavia, esso richiede una rigorosa disciplina operativa onde evitare il commit accidentale di file binari, artefatti temporanei o contenenti dati sensibili, che potrebbero compromettere la pulizia e la sicurezza del repository.
7.1 Il Principio cardinale del file .gitignore
Sezione intitolata â7.1 Il Principio cardinale del file .gitignoreâĂ fatto divieto assoluto di includere la directory .venv (o le directory degli ambienti Conda locali) nel repository Git, in alcuna circostanza. Tale pratica è considerata un grave errore procedurale per i seguenti motivi:
-
Ridondanza Dimensionale: Una directory
.venvmedia contiene migliaia di file e svariati megabyte di dati ridondanti, replicabili facilmente tramiterequirements.txtoenvironment.yml. -
Assenza di PortabilitĂ : I file binari (e.g., interprete Python, librerie C compilate quali
numpyopsycopg2) sono strettamente specifici per il Sistema Operativo e lâarchitettura della CPU (x86 vs ARM). Un ambiente creato su macOS risulterebbe totalmente inoperabile su Windows o Linux. -
Sicurezza e Privacy: La directory potrebbe contenere script con percorsi assoluti riferiti alla macchina locale (hardcoded paths) o file di configurazione con credenziali non sanificate.
Ciò che deve essere sottoposto a versionamento è la âricettaâ dichiarativa per la ricostruzione dellâambiente (requirements.txt, pyproject.toml o environment.yml), non lâambiente medesimo.
7.2 Strategie e metodologie per la generazione del file .gitignore
Sezione intitolata â7.2 Strategie e metodologie per la generazione del file .gitignoreâLa redazione manuale ex novo di un file .gitignore è unâoperazione propensa allâerrore e sconsigliata. Esistono molteplici approcci, dalla generazione via interfaccia web allâautomazione completa tramite CLI, che garantiscono la creazione di file di esclusione completi e robusti.
7.2.1 Approccio A: Generazione via Interfaccia web (GUI)
Sezione intitolata â7.2.1 Approccio A: Generazione via Interfaccia web (GUI)âQuesto metodo è ideale per chi preferisce strumenti visuali e desidera combinare rapidamente configurazioni per diversi sistemi operativi e IDE.
-
Strumento: gitignore.io
-
Procedura:
-
Accedere al sito.
-
Digitare i tag rilevanti nel campo di ricerca (es. âPythonâ, âWindowsâ, âLinuxâ, âmacOSâ, âVisual Studio Codeâ).
-
Scaricare il file generato e salvarlo nella root del progetto come
.gitignore.
-
7.2.2 Approccio B: Generazione via riga di comando (CLI universale)
Sezione intitolata â7.2.2 Approccio B: Generazione via riga di comando (CLI universale)âQuesto metodo sfrutta lâAPI di gitignore.io direttamente dal terminale, utilizzando comandi standard come curl disponibili su tutti i sistemi operativi moderni. Ă la soluzione prediletta per lâautomazione.
# Comando universale (bash/zsh/powershell)curl -L https://www.toptal.com/developers/gitignore/api/python,windows,linux,macos,visualstudiocode,jetbrains > .gitignore7.2.3 Approccio C: Generazione tramite strumenti Python dedicati (CLI specifica)
Sezione intitolata â7.2.3 Approccio C: Generazione tramite strumenti Python dedicati (CLI specifica)âPer flussi di lavoro puramente Python, è possibile utilizzare pacchetti dedicati come ignr che offrono interfacce CLI piĂš amichevoli rispetto a curl.
# 1. Installazione (preferibilmente con pipx)pipx install ignr
# 2. Generazione del fileignr -p python > .gitignore7.2.4 Approccio D: Generazione automatica (Scaffolding moderno)
Sezione intitolata â7.2.4 Approccio D: Generazione automatica (Scaffolding moderno)âStrumenti di nuova generazione come uv (piĂš avanti sono mostrati i dettagli e lâinstallazione) o poetry includono la creazione automatica di un .gitignore ottimizzato al momento dellâinizializzazione del progetto.
# Creazione progetto con uvuv init nome_progetto# Risultato: Genera struttura cartelle + pyproject.toml + .python-version + .gitignore corretto7.2.5 Modello di riferimento (Template essenziale)
Sezione intitolata â7.2.5 Modello di riferimento (Template essenziale)âQualora si renda necessaria la creazione manuale o la verifica di un file esistente, si riporta di seguito un modello di riferimento che copre la quasi totalitĂ delle casistiche per un progetto Python moderno.
# --- Byte-compiled / optimized / DLL files ---__pycache__/*.py[cod]*$py.class
# --- C extensions ---*.so
# --- Distribution / packaging ---.Pythonbuild/develop-eggs/dist/downloads/eggs/.eggs/lib/lib64/parts/sdist/var/wheels/*.egg-info/.installed.cfg*.egg
# --- Virtual Environments (CRUCIALE) ---# Nomi comuni per i venv che devono essere tassativamente ignorativenv/env/ENV/env.bak/venv.bak/.venv/
# --- Unit test / coverage reports ---htmlcov/.tox/.nox/.coverage.coverage.*.cachenosetests.xmlcoverage.xml*.cover.hypothesis/.pytest_cache/
# --- Jupyter Notebook ---.ipynb_checkpoints
# --- Ambienti IDE (Opzionale ma Raccomandato) ---.vscode/.idea/
# --- Environment variables (SICUREZZA: MAI caricare chiavi segrete!) ---.env7.3 Configurazione del repository e push su GitHub
Sezione intitolata â7.3 Configurazione del repository e push su GitHubâProcedura dettagliata per lâinizializzazione di un repository incontaminato e conforme alle best practices:
-
Setup Locale:
Finestra del terminale git init# VERIFICA PRELIMINARE CRUCIALE: Accertarsi che .venv sia ignorato (e.g., tramite 'git status')# La cartella non deve apparire tra i file 'Untracked'.# Solo successivamente eseguire l'aggiunta dei file.git add .git commit -m "Initial commit: project scaffolding and configuration" -
Strategia di Branching (Cenni):
Ă buona norma astenersi dallâoperare direttamente sul branch main, preferendo lâuso di feature branches.
Finestra del terminale git checkout -b feature/setup-ambiente# ... esecuzione modifiche ...git commit -m "Add dependency management configuration" -
Collegamento Remoto:
Finestra del terminale git branch -M maingit remote add origin https://github.com/UTENTE/NOME_REPO.gitgit push -u origin main
8. Metodologie di nuova generazione: Lâadozione di uv
Sezione intitolata â8. Metodologie di nuova generazione: Lâadozione di uvâIntrodotto nel 2024, uv rappresenta un cambiamento paradigmatico e un salto evolutivo nel packaging Python. Sviluppato in Rust da Astral (creatori del linter ruff), è progettato per offrire prestazioni superiori da 10 a 100 volte rispetto a pip e pip-tools, unificando funzionalitĂ che precedentemente richiedevano lâimpiego di molteplici strumenti distinti (gestione versioni Python, gestione venv, gestione dipendenze).
8.1 SuperioritĂ tecnologica di uv
Sezione intitolata â8.1 SuperioritĂ tecnologica di uvâ-
VelocitĂ estrema: La risoluzione delle dipendenze avviene in tempi pressochĂŠ istantanei, grazie a un resolver in Rust altamente ottimizzato e parallelizzato.
-
Gestione unificata e cache globale: Amministra versioni di Python (installandole se mancanti), ambienti virtuali, dipendenze e strumenti globali, utilizzando una cache centralizzata che evita il riscaricamento dei pacchetti per progetti diversi.
-
File di lock multipiattaforma: Genera un file
uv.lockche garantisce installazioni rigorosamente deterministiche su qualsivoglia sistema operativo, risolvendo una limitazione storica del comandopip freezeche spesso produceva output specifici per la piattaforma di generazione.
8.2 Installazione e Configurazione dellâAmbiente
Sezione intitolata â8.2 Installazione e Configurazione dellâAmbienteâA differenza di altri strumenti Python che dipendono dallâinterprete di sistema, uv è distribuito come singolo binario compilato staticamente, il che ne facilita lâinstallazione indipendente.
Metodo Raccomandato (Script Standalone):
Questo metodo garantisce che uv si aggiorni autonomamente e non entri in conflitto con i pacchetti Python installati.
-
Linux / macOS:
Finestra del terminale curl -LsSf https://astral.sh/uv/install.sh | sh -
Windows (PowerShell):
Finestra del terminale powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
Metodo Alternativo (PyPI):
Sebbene possibile, lâinstallazione via pip è sconsigliata per lâuso sistemico poichĂŠ lega uv a uno specifico interprete Python.
pip install uvVerifica:
uv --version# Output atteso: uv 0.x.xAggiornamento di uv:
uv self update8.3 Inizializzazione del Progetto
Sezione intitolata â8.3 Inizializzazione del Progettoâuv non adotta requirements.txt come prima scelta (sebbene lo supporti), bensĂŹ lo standard moderno definito nella PEP 518: il file pyproject.toml.
# Inizializzazione di un nuovo progetto con scaffolding automaticouv init nome_progettocd nome_progettoQuesto comando genera:
-
pyproject.toml: Metadati del progetto e dipendenze. -
.python-version: Versione Python vincolata per il progetto. -
.gitignore: Configurazione Git di base. -
main.py: Script di esempio.
Il comando crea automaticamente un ambiente virtuale .venv in background non appena necessario (es. al primo uv sync o uv run). uv gestisce automaticamente il download e lâinstallazione della versione Python richiesta se non presente nel sistema.
8.4 Gestione Dichiarativa e Migrazione delle Dipendenze
Sezione intitolata â8.4 Gestione Dichiarativa e Migrazione delle DipendenzeâAggiungere dipendenze:
# Aggiunta di pacchetti (aggiorna pyproject.toml e uv.lock)uv add pandas requests
# Aggiunta di dipendenze di sviluppouv add --dev pytest ruffRimuovere dipendenze:
# Rimozione di pacchetti (aggiorna pyproject.toml e uv.lock)uv remove requestsMigrazione da requirements.txt:
Se si possiede un progetto esistente, è possibile importare le dipendenze nel nuovo formato:
uv add -r requirements.txt8.5 Sincronizzazione e aggiornamento (CI/CD Ready)
Sezione intitolata â8.5 Sincronizzazione e aggiornamento (CI/CD Ready)âSincronizzazione (uv sync):
Allinea lo stato dellâambiente virtuale .venv con il file di lock uv.lock. Ă idempotente: rimuove pacchetti superflui e installa quelli mancanti.
uv syncAggiornamento (uv lock --upgrade):
Aggiorna le versioni dei pacchetti nel file di lock rispettando i vincoli di pyproject.toml.
# Aggiorna tutte le dipendenze ai limiti consentitiuv lock --upgrade# Applica le modifiche all'ambienteuv sync8.6 Esecuzione ephemera e tooling
Sezione intitolata â8.6 Esecuzione ephemera e toolingâuv consente lâesecuzione di script con dipendenze âal voloâ, senza la necessitĂ di attivare manualmente lâambiente.
# Esegue lo script usando l'ambiente del progettouv run main.py
# Esegue uno script con dipendenze temporanee (senza installarle nel progetto)uv run --with pandas script_analisi.py9. Ingegneria della qualitĂ del codice: Analisi Statica e Formattazione
Sezione intitolata â9. Ingegneria della qualitĂ del codice: Analisi Statica e FormattazioneâLâadozione di rigorosi standard di qualitĂ del codice (linting) e di formattazione automatica (formatting) non è opzionale nello sviluppo professionale moderno. Questi strumenti prevengono bug logici, uniformano lo stile tra diversi sviluppatori e riducono drasticamente il tempo dedicato alla code review.
Attualmente, lâecosistema Python sta vivendo una transizione tra una toolchain classica (frammentata e basata su Python) e una toolchain moderna (unificata e basata su Rust).
9.1 Analisi Comparativa: Toolchain Classica vs Moderna
Sezione intitolata â9.1 Analisi Comparativa: Toolchain Classica vs Modernaâ| Caratteristica | Toolchain Classica (Python-based) | Toolchain Moderna (Ruff) |
|---|---|---|
| Componenti | Black (Formattazione), isort (Ordinamento import), Pylint (Linting profondo), Flake8 (Linting stilistico) | Ruff (Tutto incluso) |
| Prestazioni | Lente (secondi/minuti su codebase grandi). Single-core per default. | Estreme (millisecondi). Scritto in Rust, parallelizzato nativamente. |
| Configurazione | Frammentata (multipli file o sezioni diverse nel pyproject.toml). Conflitti frequenti tra Black e isort/Flake8. | Centralizzata in unâunica sezione [tool.ruff]. CompatibilitĂ garantita by design. |
| Manutenzione | Richiede lâinstallazione e lâaggiornamento di 4+ pacchetti separati. | Un solo binario, una sola dipendenza. |
Prestazioni: In benchmark su codebase come CPython o Airflow, Ruff risulta dai 10 ai 100 volte piĂš veloce della combinazione Flake8 + Black.
9.2 Configurazione A: Workflow Moderno con Ruff (Raccomandato)
Sezione intitolata â9.2 Configurazione A: Workflow Moderno con Ruff (Raccomandato)âRuff sostituisce Black, isort, Flake8 e gran parte di Pylint.
1. Installazione
Sezione intitolata â1. InstallazioneâRuff può essere installato come tool globale (via pipx) per lâuso da terminale, o aggiunto alle dipendenze di sviluppo del progetto.
# Installazione globale (per uso CLI ovunque)pipx install ruff
# Aggiunta al progetto (con uv o pip)uv add --dev ruff# oppurepip install ruff2. Configurazione (pyproject.toml)
Sezione intitolata â2. Configurazione (pyproject.toml)âPer abilitare la formattazione e lâordinamento degli import, è necessario configurare esplicitamente Ruff nel pyproject.toml.
[tool.ruff]# Lunghezza riga (compatibile con Black)line-length = 88target-version = "py310"
[tool.ruff.lint]# Abilita regole:# E, W: Errori e Warning standard (simili a Flake8)# F: Pyflakes# I: isort (ordinamento import)# B: Flake8-bugbear (bug comuni)# UP: Pyupgrade (modernizzazione sintassi)select = ["E", "W", "F", "I", "B", "UP"]ignore = []
[tool.ruff.format]# Usa lo stile delle virgolette doppie (come Black)quote-style = "double"# Indenta con spaziindent-style = "space"3. Configurazione VS Code (settings.json)
Sezione intitolata â3. Configurazione VS Code (settings.json)âPer integrare Ruff in VS Code, installare lâestensione ufficiale Ruff (identificativo: charliermarsh.ruff).
Di seguito la configurazione consigliata per settings.json, che imposta Ruff come formattatore predefinito e definisce regole esplicite (utili se non si usa pyproject.toml):
{ "[python]": { "editor.defaultFormatter": "charliermarsh.ruff", "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll": "explicit", "source.organizeImports": "explicit" } }, // Configurazione opzionale: Definizione regole direttamente in VS Code // (Utile se non si desidera usare pyproject.toml) "ruff.lineLength": 88, "ruff.lint.select": [ "E", // pycodestyle errors "W", // pycodestyle warnings "F", // pyflakes "I", // isort "B", // flake8-bugbear "SIM", // flake8-simplify "PL", // flake8-pie "D", // pydocstyle "UP" // pyupgrade ], "python.analysis.typeCheckingMode": "standard", "python.analysis.autoImportCompletions": true, "python.analysis.importFormat": "absolute", "python.analysis.autoIndent": true, "python.analysis.enableTroubleshootMissingImports": true, "python.analysis.indexing": false, "python.languageServer": "Default",}9.3 Configurazione B: Workflow Classico (Black, Pylint, isort)
Sezione intitolata â9.3 Configurazione B: Workflow Classico (Black, Pylint, isort)âSe si lavora su progetti legacy o si necessita dellâanalisi statica molto profonda (inferenza di tipi complessa) che Pylint offre ancora in esclusiva.
1. Installazione tools
Sezione intitolata â1. Installazione toolsâĂ necessario installare tutti i tool separatamente.
pip install black pylint isort2. Configurazione VS Code
Sezione intitolata â2. Configurazione VS CodeâMicrosoft ha deprecato la configurazione monolitica di Python in favore di estensioni separate. Ă necessario installare dal Marketplace:
-
Black Formatter (ms-python.black-formatter)
-
Pylint (ms-python.pylint)
-
isort (ms-python.isort)
-
Pylance (ms-python.vscode-pylance) - Fondamentale per lâIntelliSense e il controllo tipi statico di base.
Configurazione .vscode/settings.json:
{ "[python]": { "editor.defaultFormatter": "ms-python.black-formatter", "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.organizeImports": "explicit" } }, // Configurazione specifica Pylint "pylint.args": [ "--max-line-length=88", "--disable=C0111" // Disabilita check docstrings mancanti ], // Configurazione isort per compatibilitĂ con Black "isort.args": ["--profile", "black"]}3. Configurazione pyproject.toml per CompatibilitĂ
Sezione intitolata â3. Configurazione pyproject.toml per CompatibilitĂ âPer evitare che Black e isort entrino in conflitto, è necessario configurare isort per riconoscere il profilo Black.
[tool.black]line-length = 88
[tool.isort]profile = "black"line_length = 889.4 Type Checking Statico Moderno con ty
Sezione intitolata â9.4 Type Checking Statico Moderno con tyâAccanto al linting e alla formattazione, lo sviluppo Python professionale richiede un controllo statico dei tipi (static type checking) capace di intercettare errori semantici prima dellâesecuzione: accessi a membri inesistenti, ritorni incompatibili, usi impropri di Optional, importazioni di simboli non coerenti con gli stub, mismatch tra collezioni e type hints. In questo contesto, ty rappresenta una delle proposte piuâ moderne dellâecosistema: eâ un type checker e language server scritto in Rust, sviluppato da Astral, con unâattenzione particolare a prestazioni, analisi incrementale e integrazione editoriale.
Dal punto di vista architetturale, ty non sostituisce Ruff: i due strumenti operano su piani diversi e complementari.
-
Ruff: linting, stile, formattazione, ordinamento import, classi di bug note.
-
ty: analisi statica dei tipi, coerenza semantica tra annotazioni, inferenza, controllo delle importazioni e diagnostica di tipo.
La combinazione ruff + ty costituisce quindi una toolchain moderna interamente basata su strumenti ad alte prestazioni scritti in Rust.
1. Cosa controlla concretamente ty
Sezione intitolata â1. Cosa controlla concretamente tyâUn type checker statico non âesegueâ il programma: analizza il codice e verifica che le operazioni siano coerenti con i tipi dichiarati o inferiti. Si consideri il seguente esempio minimale:
from typing import Optional
def upper_name(name: Optional[str]) -> str: return name.upper()Il codice puoâ sembrare innocuo, ma il parametro name puoâ assumere anche valore None; dunque lâinvocazione name.upper() non eâ garantita. Un type checker come ty segnala il problema prima ancora che il ramo difettoso venga eseguito a runtime.
Un esempio corretto eâ il seguente:
from typing import Optional
def upper_name(name: Optional[str]) -> str: if name is None: return "" return name.upper()Gli scenari in cui ty risulta particolarmente utile sono:
-
basi di codice di media e grande dimensione con molti moduli e import incrociati;
-
progetti con API interne tipizzate (
dataclass,TypedDict,Protocol, generics); -
backend FastAPI o librerie riutilizzabili, ove la stabilitaâ delle interfacce pubbliche eâ fondamentale;
-
refactoring estesi, nei quali il type checking previene regressioni silenziose.
2. Modalitaâ di installazione: nessun setup, globale, locale al progetto
Sezione intitolata â2. Modalitaâ di installazione: nessun setup, globale, locale al progettoâty puoâ essere adottato con diversi livelli di persistenza operativa.
A. Esecuzione immediata senza installazione persistente
Sezione intitolata âA. Esecuzione immediata senza installazione persistenteâIl metodo piuâ rapido eâ usare uvx, che esegue ty in un ambiente effimero ma cache-izzato:
uvx ty checkuvx ty check src testsuvx ty check --watchQuesta modalitaâ eâ ideale per:
-
provare il tool su un repository esistente senza modificare le dipendenze;
-
eseguire verifiche una tantum in aula o in CI sperimentali;
-
valutare rapidamente il livello di rumore diagnostico prima di adottarlo stabilmente.
B. Installazione globale stabile
Sezione intitolata âB. Installazione globale stabileâSe si desidera avere il comando disponibile ovunque nel PATH, si puoâ installare ty come tool globale.
Con uv:
uv tool install ty@latestty versionAggiornamento:
uv tool upgrade tyCon pipx:
pipx install tyty versionAggiornamento:
pipx upgrade tyCon pip nellâambiente Python corrente:
pip install tyty versionLâinstallazione via pip eâ appropriata solo se si accetta di legare ty allo specifico interprete corrente; per uso sistemico risultano generalmente preferibili uv tool install o pipx.
C. Installazione come dipendenza di sviluppo del singolo progetto
Sezione intitolata âC. Installazione come dipendenza di sviluppo del singolo progettoâQuesto eâ il modello piuâ rigoroso per team e repository versionati, poicheâ vincola la versione dello strumento al progetto stesso.
Con uv:
uv add --dev tyuv run ty checkAggiornamento controllato della dipendenza:
uv lock --upgrade-package tyuv syncCon pip dentro il .venv del progetto:
pip install tyty checkIn termini metodologici, la regola puoâ essere formulata cosiâ:
-
usare
uvx ty checkper esperimenti o esecuzioni spot; -
usare
uv tool install tyopipx install typer un tool personale sempre disponibile; -
usare
uv add --dev typer garantire coerenza tra tutti i collaboratori del progetto.
3. Uso basilare senza configurazione dedicata
Sezione intitolata â3. Uso basilare senza configurazione dedicataâUna caratteristica importante di ty eâ la capacitaâ di funzionare bene anche in progetti senza configurazione esplicita. In assenza di setup avanzato:
-
cerca lâambiente virtuale attivo tramite
VIRTUAL_ENV; -
se non trova un ambiente attivo, prova a individuare una directory
.venvnella root del progetto; -
in ultima istanza usa un interprete
python3opythondisponibile nelPATH.
Pertanto, in un repository Python semplice, spesso eâ sufficiente:
ty checkOppure, se si vuole limitare lâanalisi a percorsi specifici:
ty check srcty check src teststy check app/main.pyPer mantenere il controllo continuamente attivo durante lo sviluppo:
ty check --watchEsempio di progetto minimale senza configurazione dedicata:
progetto_minimale/âââ .venv/âââ src/â âââ main.pyâââ pyproject.tomlSe src/main.py contiene annotazioni corrette e il .venv eâ attivo o rilevabile, ty puoâ operare immediatamente senza alcun file ty.toml.
4. Progetto moderno con pyproject.toml: configurazione consigliata
Sezione intitolata â4. Progetto moderno con pyproject.toml: configurazione consigliataâQuando il progetto usa giaâ pyproject.toml, la configurazione piuâ naturale consiste nellâaggiungere la sezione [tool.ty]. Questo approccio centralizza in un unico file sia i metadati del progetto sia la configurazione del type checker.
Esempio realistico per progetto con layout src/:
[project]name = "inventory-service"version = "0.1.0"requires-python = ">=3.12"
[tool.ty.src]include = ["src", "tests"]exclude = ["tests/fixtures/**", "generated/**"]
[tool.ty.environment]python-version = "3.12"root = ["./src"]
[tool.ty.rules]possibly-unresolved-reference = "warn"
[tool.ty.terminal]output-format = "full"error-on-warning = false
[[tool.ty.overrides]]include = ["tests/**", "**/test_*.py"]
[tool.ty.overrides.rules]possibly-unresolved-reference = "ignore"Questa configurazione esprime alcune best practice importanti:
-
project.requires-pythonaiutatya inferire correttamente la versione target del linguaggio; -
[tool.ty.src]delimita esplicitamente il perimetro dellâanalisi; -
[tool.ty.environment]eâ utile per specificare versione Python, root del progetto e, se necessario, interprete o ambiente non standard; -
[tool.ty.rules]permette di graduare severitaâ diverse (ignore,warn,error); -
[[tool.ty.overrides]]consente di allentare o irrigidire il controllo su aree specifiche, ad esempio test, file generati o directory sperimentali.
Esecuzione tipica in questo scenario:
uv run ty checkuv run ty check --watch5. Progetto senza pyproject.toml o con configurazione separata: ty.toml
Sezione intitolata â5. Progetto senza pyproject.toml o con configurazione separata: ty.tomlâNon tutti i repository Python adottano una configurazione centralizzata in pyproject.toml. Nei progetti legacy, negli script didattici o nei repository multi-tool puoâ essere preferibile un file dedicato ty.toml.
In questo caso, la struttura della configurazione eâ identica, ma senza il prefisso [tool.ty].
Esempio:
[src]include = ["src", "scripts"]exclude = ["build/**", "legacy/**"]
[environment]python = "./.venv"python-version = "3.11"root = ["./src", "./scripts"]
[rules]possibly-unresolved-reference = "warn"
[analysis]allowed-unresolved-imports = ["vendor.**"]
[terminal]output-format = "concise"Questa variante eâ appropriata quando:
-
il progetto non usa
pyproject.toml; -
si vuole mantenere il type checker separato dalla configurazione packaging/build;
-
si desidera una migrazione graduale, introducendo
tysenza riorganizzare il repository.
Va inoltre ricordato che, se in una stessa directory coesistono sia pyproject.toml sia ty.toml, ty.toml ha precedenza per la configurazione di ty.
6. Configurazioni pratiche per casi comuni
Sezione intitolata â6. Configurazioni pratiche per casi comuniâA. Progetto moderno con layout src/ e test separati
Sezione intitolata âA. Progetto moderno con layout src/ e test separatiâinventory-service/âââ .venv/âââ pyproject.tomlâââ src/â âââ inventory_service/â âââ __init__.pyâ âââ api.pyâââ tests/ âââ test_api.pyComandi consigliati:
uv add --dev tyuv run ty checkConfigurazione consigliata: root = ["./src"], inclusione di src e tests, override meno severi per test o fixture.
B. Repository di script senza packaging formale
Sezione intitolata âB. Repository di script senza packaging formaleâscript-utilities/âââ .venv/âââ scripts/â âââ cleanup.pyâ âââ report.pyâââ ty.tomlComandi consigliati:
ty check scriptsty check --watch scriptsConfigurazione tipica: include = ["scripts"], python = "./.venv", output conciso.
C. Repository legacy con dipendenze scarsamente tipizzate
Sezione intitolata âC. Repository legacy con dipendenze scarsamente tipizzateâIn codebase storiche eâ frequente incontrare librerie prive di type hints affidabili o moduli interni non risolti perfettamente. In tali casi, si puoâ adottare una strategia graduale:
[tool.ty.analysis]allowed-unresolved-imports = ["legacy_vendor.**"]replace-imports-with-any = ["pandas.**"]
[tool.ty.rules]possibly-unresolved-reference = "warn"Questo approccio riduce il rumore iniziale, consentendo di introdurre il type checking in modo incrementale invece di bloccare immediatamente tutta la pipeline.
7. Esecuzione esplicita con interprete o ambiente non standard
Sezione intitolata â7. Esecuzione esplicita con interprete o ambiente non standardâSe ty non riesce a individuare correttamente lâambiente, eâ possibile specificarlo in modo esplicito.
Da CLI:
ty check --python .venvty check --python .venv/bin/pythonty check --python .\.venvOppure via configurazione:
[tool.ty.environment]python = "./custom-venv/.venv"python-version = "3.12"Questo eâ particolarmente utile quando:
-
il virtual environment si trova in una directory non convenzionale;
-
si lavora con piuâ ambienti Python paralleli;
-
si vuole rendere deterministica la risoluzione delle dipendenze in CI/CD.
8. Integrazione con VS Code
Sezione intitolata â8. Integrazione con VS CodeâLâintegrazione editoriale di ty eâ uno dei punti piuâ interessanti dello strumento. Astral mantiene una estensione ufficiale per VS Code: astral-sh.ty.
Lâestensione offre:
-
diagnostica di type checking in tempo reale;
-
linguaggio server con navigazione del codice, completamenti, hover, auto-import e inlay hints;
-
integrazione diretta con la configurazione di
tye con lâambiente Python del workspace.
Modalitaâ A: usare ty come language server principale
Sezione intitolata âModalitaâ A: usare ty come language server principaleâQuesta modalitaâ eâ coerente con una toolchain completamente centrata su Astral (ruff + ty + uv). Lâestensione ty imposta di default python.languageServer a "None" per evitare di eseguire contemporaneamente due language server Python.
Configurazione consigliata di .vscode/settings.json:
{ "python.languageServer": "None", "ty.diagnosticMode": "workspace", "ty.inlayHints.variableTypes": true, "ty.inlayHints.callArgumentNames": true, "ty.completions.autoImport": true, "ty.importStrategy": "fromEnvironment"}Questa configurazione eâ adatta quando si vuole che ty gestisca sia type checking sia servizi LSP principali.
Modalitaâ B: usare ty solo per type checking e Pylance per IntelliSense
Sezione intitolata âModalitaâ B: usare ty solo per type checking e Pylance per IntelliSenseâIn alcuni team puoâ essere preferibile mantenere Pylance per completamento, navigazione e funzionalitaâ consolidate Microsoft, delegando a ty la sola diagnostica di tipo.
Configurazione consigliata:
{ "python.languageServer": "Pylance", "ty.disableLanguageServices": true, "ty.diagnosticMode": "workspace", "ty.showSyntaxErrors": false}Questa modalitaâ eâ utile quando:
-
il team usa giaâ Pylance e non vuole modificare radicalmente lâergonomia editoriale;
-
si desidera confrontare gradualmente la qualitaâ diagnostica di
tyrispetto a Pyright/Pylance; -
si vuole evitare la sovrapposizione di hover, completamenti e definizioni provenienti da due server distinti.
Modalitaâ C: forzare un binario specifico di ty
Sezione intitolata âModalitaâ C: forzare un binario specifico di tyâSe il workspace usa una installazione locale o un path non standard, lâestensione consente di indicare esplicitamente lâeseguibile:
{ "ty.path": ["${workspaceFolder}/.venv/Scripts/ty.exe"], "ty.diagnosticMode": "workspace"}Oppure, in ambiente POSIX:
{ "ty.path": ["${workspaceFolder}/.venv/bin/ty"]}In alternativa, si puoâ indicare un interprete Python da cui lâestensione tenteraâ di ricavare ty:
{ "ty.interpreter": ["${workspaceFolder}/.venv/bin/python"]}Modalitaâ D: tre setup pronti per settings.json
Sezione intitolata âModalitaâ D: tre setup pronti per settings.jsonâAlla luce dei test pratici piuâ comuni in VS Code, eâ utile distinguere tre profili operativi giaâ pronti, ciascuno con obiettivi diversi. I seguenti blocchi sono concepiti per essere copiati nella configurazione utente o di workspace, fermo restando che lâimpostazione python.defaultInterpreterPath eâ da intendersi come fallback iniziale e non come selezione permanente dellâinterprete del progetto.
Se si desidera un interprete globale iniziale per i workspace nuovi, si puoâ usare:
"python.defaultInterpreterPath": "c:\\Program Files\\Python313\\python.exe"Se invece si lavora sistematicamente con ambienti virtuali locali al repository, eâ spesso preferibile omettere questa impostazione nelle user settings e selezionare lâinterprete del progetto tramite il comando Python: Select Interpreter.
Setup 1: Ruff + Pylance senza ty
Sezione intitolata âSetup 1: Ruff + Pylance senza tyâQuesto eâ il profilo piuâ conservativo e, nella pratica, spesso quello che fornisce lâhover piuâ ricco e dettagliato su classi, funzioni e simboli della libreria standard.
"[python]": { "editor.defaultFormatter": "charliermarsh.ruff", "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll": "explicit", "source.organizeImports": "explicit" }},"ruff.lineLength": 88,"ruff.lint.select": [ "E", "W", "F", "I", "B", "SIM", "PL", "D", "UP"],"python.languageServer": "Pylance","python.analysis.typeCheckingMode": "standard","python.analysis.autoImportCompletions": true,"python.analysis.importFormat": "absolute","python.analysis.autoIndent": true,"python.analysis.enableTroubleshootMissingImports": true,"python.analysis.indexing": falseCosa viene attivato in questo setup:
-
Ruff: formattazione, linting, fix automatici e organizzazione import;
-
Pylance: hover, completamento, go to definition, IntelliSense e type checking;
-
ty: non coinvolto nel workflow editoriale.
Quando sceglierlo:
-
se si desidera la massima qualitaâ dellâesperienza editoriale in VS Code;
-
se si preferiscono hover piuâ ricchi e documentativi;
-
se non eâ necessario introdurre
tydirettamente nellâeditor.
Setup 2: Ruff + ty come full Astral stack
Sezione intitolata âSetup 2: Ruff + ty come full Astral stackâQuesto profilo disattiva Pylance come language server e affida a ty sia il type checking sia i servizi LSP principali.
"[python]": { "editor.defaultFormatter": "charliermarsh.ruff", "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll": "explicit", "source.organizeImports": "explicit" }},"ruff.lineLength": 88,"ruff.lint.select": [ "E", "W", "F", "I", "B", "SIM", "PL", "D", "UP"],"python.languageServer": "None","ty.disableLanguageServices": false,"ty.diagnosticMode": "workspace","ty.inlayHints.variableTypes": true,"ty.inlayHints.callArgumentNames": true,"ty.completions.autoImport": trueCosa viene attivato in questo setup:
-
Ruff: formattazione, linting, fix automatici e organizzazione import;
-
ty: type checking, hover, completamento, go to definition, inlay hints e auto-import;
-
Pylance: disattivato come language server.
Quando sceglierlo:
-
se si vuole una toolchain coerente con lâecosistema Astral (
uv + ruff + ty); -
se si accetta un hover talvolta piuâ sintetico rispetto a Pylance;
-
se si desidera che il controllo statico e i servizi di linguaggio provengano dallo stesso tool.
Setup 3: Ruff + Pylance + ty con ty solo per type checking
Sezione intitolata âSetup 3: Ruff + Pylance + ty con ty solo per type checkingâQuesto profilo ibrido mantiene Pylance per lâergonomia editoriale e usa ty solo per la diagnostica di tipo.
"[python]": { "editor.defaultFormatter": "charliermarsh.ruff", "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll": "explicit", "source.organizeImports": "explicit" }},"ruff.lineLength": 88,"ruff.lint.select": [ "E", "W", "F", "I", "B", "SIM", "PL", "D", "UP"],"python.analysis.typeCheckingMode": "off","python.analysis.autoImportCompletions": true,"python.analysis.importFormat": "absolute","python.analysis.autoIndent": true,"python.analysis.enableTroubleshootMissingImports": true,"python.analysis.indexing": false,"python.languageServer": "Pylance","ty.disableLanguageServices": true,"ty.diagnosticMode": "workspace"Cosa viene attivato in questo setup:
-
Ruff: formattazione, linting, fix automatici e organizzazione import;
-
Pylance: hover, completamento, go to definition e IntelliSense;
-
ty: type checking diagnostico nel workspace, senza hover o altri language services;
-
Pylance type checking: disattivato, per evitare sovrapposizioni con
ty.
Quando sceglierlo:
-
se si desidera mantenere lâhover e lâIntelliSense di Pylance;
-
se si vuole sperimentare
tycome solo type checker; -
se si desidera una migrazione graduale verso toolchain piuâ moderne.
Osservazione pratica importante:
-
in molti ambienti reali, il primo setup (
Ruff + Pylance) continua a offrire lâhover piuâ completo e ricco; -
il secondo setup (
Ruff + ty) privilegia la coerenza della toolchain Astral, ma puoâ mostrare hover piuâ essenziali; -
il terzo setup (
Ruff + Pylance + ty) eâ teoricamente il piuâ bilanciato, ma va verificato empiricamente nel proprio ambiente VS Code, poicheâ lâinterazione tra estensioni puoâ variare.
9. Workflow operativi raccomandati
Sezione intitolata â9. Workflow operativi raccomandatiâWorkflow A: adozione immediata senza cambiare il progetto
Sezione intitolata âWorkflow A: adozione immediata senza cambiare il progettoâuvx ty checkuvx ty check --watchIdeale per audit iniziale di un repository esistente.
Workflow B: progetto moderno con uv, Ruff e ty
Sezione intitolata âWorkflow B: progetto moderno con uv, Ruff e tyâuv add --dev ruff tyuv run ruff check .uv run ty checkQuesto eâ probabilmente il workflow piuâ pulito per un nuovo progetto Python moderno.
Workflow C: tool globale personale
Sezione intitolata âWorkflow C: tool globale personaleâuv tool install ty@latestty check ~/progetti/mio-scriptAppropriato per chi lavora spesso su repository eterogenei e vuole avere ty sempre disponibile senza entrare ogni volta in un venv.
10. Criteri decisionali
Sezione intitolata â10. Criteri decisionaliâSi raccomanda ty quando:
-
si desidera introdurre type checking statico in modo moderno e veloce;
-
si lavora giaâ con
uveruffe si vuole mantenere coerenza di ecosistema; -
si vuole usare un language server capace di type checking incrementale ad alte prestazioni;
-
si preferisce una configurazione graduale, con regole modulabili tra
warn,erroreignore.
Si raccomanda invece di procedere con cautela nei seguenti casi:
-
codebase molto legacy con annotazioni quasi assenti, ove potrebbe essere necessario un onboarding graduale;
-
repository in cui il team dipende fortemente da un setup editoriale giaâ costruito attorno a Pylance o mypy;
-
pipeline esistenti che richiedono una migrazione pianificata delle convenzioni di type checking.
In sintesi, ty non va interpretato come semplice âlinter dei tipiâ, ma come un componente strutturale della qualitaâ del software Python moderno: puoâ essere usato senza setup, installato globalmente o versionato nel progetto, e si integra bene sia in workflow minimali sia in architetture professionali basate su uv, ruff e VS Code.
9.5 Pylance, ty e il Language Server Protocol
Sezione intitolata â9.5 Pylance, ty e il Language Server ProtocolâNel panorama attuale di VS Code, Pylance e ty possono essere visti come due strategie differenti per portare intelligence editoriale e controllo statico nel workflow Python.
-
Pylance: eccelle nellâecosistema Microsoft, offre IntelliSense maturo ed eâ basato su Pyright.
-
ty: unisce type checking e language server in un tool unico, moderno e molto veloce, integrato nativamente con lâecosistema Astral.
-
Ruff/Pylint: continuano a coprire il dominio del linting, dello stile e di alcune classi di bug non prettamente tipizzate.
Le combinazioni operative piuâ sensate oggi sono:
-
Ruff + Pylance: workflow molto diffuso, conservativo e ben supportato.
-
Ruff + ty: workflow moderno, coerente con
uv, ad alte prestazioni. -
Ruff + Pylance + ty (solo diagnostica): soluzione ibrida per migrazioni graduali.
10. Tassonomia dei Casi dâUso e Architetture di Riferimento
Sezione intitolata â10. Tassonomia dei Casi dâUso e Architetture di RiferimentoâLâarchitettura del file system e la gestione delle dipendenze non sono monolitiche; esse variano sensibilmente in funzione della tipologia di applicazione. Di seguito si delineano quattro paradigmi architetturali comuni, evidenziando le specificitĂ strutturali e i requisiti di configurazione.
10.1 Progetti Backend ad Alte Prestazioni (Microservizi/FastAPI)
Sezione intitolata â10.1 Progetti Backend ad Alte Prestazioni (Microservizi/FastAPI)âIn contesti ove si predilige lâuso di framework asincroni moderni come FastAPI, la struttura deve favorire la containerizzazione (Docker) e la separazione dei contesti di esecuzione.
-
PeculiaritĂ : Uso intensivo di
uvicorncome server ASGI; necessitĂ rigorosa di file di lock (uv.lockorequirements.lock) per garantire la stabilitĂ nei container di produzione. -
Struttura Consigliata:
my-microservice/âââ app/â âââ __init__.pyâ âââ main.py # Entry point dell'applicazione (FastAPI instance)â âââ routers/ # Separazione delle rotte APIâ âââ core/ # Configurazioni e modelli Pydanticâââ tests/ # Suite di test (pytest)âââ Dockerfile # Istruzioni di containerizzazioneâââ pyproject.toml # Definizione dipendenzeâââ uv.lock # Snapshot deterministico delle versioni
10.2 Applicazioni a Riga di Comando (CLI)
Sezione intitolata â10.2 Applicazioni a Riga di Comando (CLI)âPer strumenti destinati allâuso da terminale (sviluppati con librerie quali Click, Typer o Argparse), lâobiettivo primario è la distribuibilitĂ . Tali progetti sono spesso progettati per essere installati via pipx.
-
PeculiaritĂ : Definizione degli entry points nel file
pyproject.toml(sezione[project.scripts]) per rendere eseguibile il comando; il codice sorgente è tipicamente incapsulato in una directory con il nome del tool. -
Configurazione Entry Point (
pyproject.toml):[project.scripts]my-tool = "my_cli_package.main:app" -
Struttura Consigliata:
my-cli-tool/âââ my_cli_package/â âââ __init__.pyâ âââ main.py # Logica principale e parsing argomentiâ âââ utils.pyâââ pyproject.toml # Contiene la definizione dello script eseguibileâââ README.md
10.3 Applicazioni Desktop con Interfaccia Grafica (GUI)
Sezione intitolata â10.3 Applicazioni Desktop con Interfaccia Grafica (GUI)âI progetti che impiegano framework grafici pesanti (come PyQt6, PySide6 o Tkinter) presentano sfide uniche riguardanti la gestione degli asset statici e la compilazione in eseguibili standalone.
-
PeculiaritĂ : Gestione di file non-codice (icone, file
.ui, immagini) che non devono essere tracciati se generati automaticamente; dipendenze di sistema complesse; uso frequente di strumenti di âfreezingâ comePyInstaller. -
Nota sul
.gitignore: Ă cruciale ignorare le cartelle di build generate dai compilatori (build/,dist/) e i file spec temporanei. -
Struttura Consigliata:
my-gui-app/âââ assets/ # Icone, immagini, fogli di stile (non codice)âââ src/â âââ ui/ # Layout graficiâ âââ controllers/ # Logica applicativaâ âââ app.py # Entry point GUIâââ build_scripts/ # File .spec per PyInstallerâââ requirements.txtâââ main.py # Wrapper di avvio
10.4 Framework Web Full-Stack Monolitici (Django)
Sezione intitolata â10.4 Framework Web Full-Stack Monolitici (Django)âI progetti Django seguono una convenzione strutturale rigida (âConvention over Configurationâ) che differisce dai microservizi.
-
PeculiaritĂ : Presenza dello script di gestione
manage.pynella root; necessitĂ di separare le configurazioni (settings.py) per ambienti di sviluppo e produzione. -
Best Practice: Evitare di avere un unico
settings.py. Suddividere la configurazione in un modulo dedicato. -
Struttura Consigliata:
my-django-project/âââ config/ # (Rinomina della cartella di progetto default)â âââ __init__.pyâ âââ settings/ # Modulo impostazioniâ â âââ __init__.pyâ â âââ base.py # Configurazioni comuniâ â âââ local.py # Configurazione Dev (debug=True)â â âââ production.py # Configurazione Prod (debug=False)â âââ urls.pyâ âââ wsgi.pyâââ apps/ # Contenitore per le app Django riutilizzabiliâ âââ utenti/â âââ catalogo/âââ manage.py # Script di gestione (non modificare)âââ pyproject.tomlâââ .env # Variabili d'ambiente (IGNORATO da Git)
10.5 Sistemi di Intelligenza Artificiale Generativa (RAG con LangChain e FastAPI)
Sezione intitolata â10.5 Sistemi di Intelligenza Artificiale Generativa (RAG con LangChain e FastAPI)âI progetti di IA moderna, in particolare quelli basati su architetture RAG (Retrieval-Augmented Generation), presentano una complessitĂ notevole in termini di gestione delle dipendenze (spesso molto pesanti, come torch o driver CUDA) e di segregazione delle responsabilitĂ tra il livello di servizio (API) e il livello cognitivo (Chains/LLM).
-
PeculiaritĂ : NecessitĂ di gestire chiavi API sensibili (OpenAI, HuggingFace) tramite file
.envrigorosamente esclusi da Git; coesistenza di codice di produzione e notebook di prototipazione sperimentale; gestione di database vettoriali locali (ChromaDB, FAISS) che richiedono directory di persistenza da ignorare nel versionamento. -
Architettura Consigliata: Si raccomanda di disaccoppiare la logica delle âCateneâ (Chains) dallâinterfaccia REST.
-
Struttura Consigliata:
rag-service-app/âââ app/â âââ api/ # Layer di interfaccia REST (FastAPI)â â âââ endpoints/ # Routes (es. /chat, /ingest)â â âââ schemas/ # Modelli Pydantic per validazione I/Oâ âââ core/ # Configurazioni globaliâ âââ chains/ # Logica LangChain (Prompt Templates, LCEL)â âââ vectorstore/ # Astrazione per accesso al Vector DB (Chroma/Qdrant)âââ data/ # Documenti grezzi (PDF, TXT) per ingestion (IGNORARE se sensibili)âââ notebooks/ # Jupyter Notebooks per sperimentazione (EDA, Prompt Engineering)âââ .env # Chiavi API (CRUCIALE: Ignorare in Git)âââ pyproject.toml # Dipendenze (langchain, fastapi, openai, chromadb)âââ uv.lock
11. Sviluppo in Container: Docker, Docker Compose e VS Code DevContainers
Sezione intitolata â11. Sviluppo in Container: Docker, Docker Compose e VS Code DevContainersâMentre gli ambienti virtuali (venv, conda) isolano le dipendenze Python, i container Docker estendono questo isolamento allâintero sistema operativo (librerie di sistema, database, configurazioni di rete). Lâutilizzo dei DevContainers in VS Code rappresenta lo standard industriale per garantire che lâintero team di sviluppo operi in condizioni identiche, eliminando il problema del âfunziona sulla mia macchinaâ.
11.1 Architettura e Vantaggi dei DevContainers
Sezione intitolata â11.1 Architettura e Vantaggi dei DevContainersâUn DevContainer (Development Container) è un contenitore Docker in cui VS Code âiniettaâ il proprio server backend. Quando si apre un progetto in un DevContainer:
-
VS Code legge la configurazione
.devcontainer/devcontainer.json. -
Costruisce o scarica lâimmagine Docker specificata.
-
Avvia il container e vi monta il codice sorgente (volume mapping).
-
Installa automaticamente le estensioni di VS Code (es. Python, Ruff, Pylance) dentro il container.
PerchĂŠ adottarlo:
-
Onboarding immediato: Un nuovo sviluppatore clona il repo, preme âReopen in Containerâ e ha tutto pronto (Python, DB, Redis, Tools) senza installare nulla sul proprio PC.
-
Isolamento Totale: Ă possibile lavorare su un progetto Python 3.7 legacy e uno 3.12 moderno simultaneamente senza conflitti di PATH o librerie di sistema.
11.2 Prerequisiti
Sezione intitolata â11.2 PrerequisitiâPer utilizzare questa tecnologia è necessario:
-
Docker Desktop (Windows/Mac) o Docker Engine (Linux). Su Mac è possibile usare alternative leggere come OrbStack.
-
Visual Studio Code.
-
Estensione VS Code: Dev Containers (id:
ms-vscode-remote.remote-containers).
11.3 Configurazione Base: Struttura .devcontainer
Sezione intitolata â11.3 Configurazione Base: Struttura .devcontainerâNella root del progetto, creare la cartella .devcontainer e il file devcontainer.json.
Esempio di devcontainer.json per Python Moderno:
{ "name": "Python 3.12 Project", "image": "mcr.microsoft.com/devcontainers/python:3.12", "features": { // Aggiunge la CLI di Docker dentro il container (Docker-in-Docker) "ghcr.io/devcontainers/features/docker-outside-of-docker:1": {}, // Aggiunge utility comuni (git, zsh, ecc.) "ghcr.io/devcontainers/features/common-utils:2": { "configureZshAsDefaultShell": true } },
// Configurazione specifica dell'editor all'interno del container "customizations": { "vscode": { "settings": { "python.defaultInterpreterPath": "/usr/local/bin/python", "python.formatting.provider": "none", "editor.formatOnSave": true, "editor.defaultFormatter": "charliermarsh.ruff" }, // Estensioni da installare automaticamente nel container "extensions": [ "ms-python.python", "ms-python.vscode-pylance", "charliermarsh.ruff", "njpwerner.autodocstring" ] } },
// Comando post-creazione per installare le dipendenze // Nota: In un container, spesso si usa l'interprete di sistema (root) o un venv utente. "postCreateCommand": "pip install --user -r requirements.txt",
// Utente remoto (vscode è l'utente predefinito nelle immagini Microsoft) "remoteUser": "vscode"}11.4 Integrazione Avanzata con Docker Compose
Sezione intitolata â11.4 Integrazione Avanzata con Docker ComposeâPer applicazioni reali che richiedono servizi accessori (Database Postgres, Cache Redis), un singolo container non basta. Si usa Docker Compose orchestrato dal DevContainer.
Struttura File:
.devcontainer/âââ devcontainer.jsonâââ docker-compose.yml1. devcontainer.json (Versione Compose):
{ "name": "Full Stack Python Dev", "dockerComposeFile": "docker-compose.yml", "service": "app", // Indica quale servizio del compose è l'ambiente di sviluppo "workspaceFolder": "/workspace",
"customizations": { "vscode": { "extensions": ["ms-python.python", "charliermarsh.ruff"] } },
"postCreateCommand": "pip install -r requirements.txt", "remoteUser": "vscode"}2. docker-compose.yml (Definizione Servizi):
version: '3.8'
services: app: # Costruisce l'immagine dall'esterno o usa un'immagine base image: mcr.microsoft.com/devcontainers/python:3.11 volumes: # Monta la cartella corrente (il progetto) in /workspace - ..:/workspace:cached # Mantiene il container attivo all'infinito command: sleep infinity # Rete condivisa con il database depends_on: - db - redis
db: image: postgres:15 environment: POSTGRES_USER: user POSTGRES_PASSWORD: password POSTGRES_DB: mydatabase volumes: - postgres-data:/var/lib/postgresql/data
redis: image: redis:alpine
volumes: postgres-data:11.5 Workflow Operativo con DevContainer
Sezione intitolata â11.5 Workflow Operativo con DevContainerâ-
Apertura: Aprire VS Code nella cartella del progetto.
-
Rilevamento: VS Code rileverĂ la cartella
.devcontainere mostrerĂ una notifica in basso a destra: âFolder contains a Dev Container configuration file. Reopen to develop in a container.â -
Build: Cliccando su âReopen in Containerâ, VS Code avvierĂ la costruzione dellâimmagine. La prima volta potrebbe richiedere alcuni minuti.
-
Sviluppo: Una volta caricato, il terminale di VS Code sarĂ una shell dentro il sistema Linux del container.
-
python --versionrestituirĂ la versione del container. -
Il codice modificato è sincronizzato in tempo reale con il file system locale.
-
-
Debug: Premendo F5, lâapplicazione verrĂ eseguita nel container, ma il debugger grafico di VS Code funzionerĂ normalmente.
Gestione del ciclo di vita:
-
Per tornare allâambiente locale: F1 -> Dev Containers: Reopen Folder Locally.
-
Per ricostruire il container (se si cambia il Dockerfile): F1 -> Dev Containers: Rebuild Container.
12. Automazione delle Procedure di Installazione e Scripting
Sezione intitolata â12. Automazione delle Procedure di Installazione e ScriptingâPer progetti a finalitĂ didattica o al fine di agevolare lâinserimento (onboarding) di nuovi collaboratori con minore esperienza tecnica, risulta eccellente prassi lâinclusione di uno script di âbootstrappingâ. Tale script ha la funzione di astrarre la complessitĂ dei comandi sottostanti e configurare lâambiente in modalitĂ automatica e resiliente.
Esempio Avanzato: setup_dev.py
Sezione intitolata âEsempio Avanzato: setup_dev.pyâIl seguente script è progettato secondo i principi della defensive programming: gestisce le eccezioni, rileva dinamicamente il sistema operativo in uso, verifica i prerequisiti e fornisce un feedback visivo chiaro allâutente. Non richiede dipendenze esterne, avvalendosi esclusivamente della libreria standard di Python per garantire la massima portabilitĂ .
import osimport subprocessimport sysimport platform
def print_step(message): """Visualizza un messaggio di stato formattato per migliorare la leggibilitĂ .""" print(f"\n{'='*40}") print(f"[*] {message}") print(f"{'='*40}")
def get_pip_command(venv_path): """ Determina il percorso assoluto corretto dell'eseguibile pip all'interno del venv, gestendo le differenze strutturali tra sistemi Windows (Scripts) e POSIX (bin). """ if os.name == "nt": # Rilevamento ambiente Windows return os.path.join(venv_path, "Scripts", "pip.exe") return os.path.join(venv_path, "bin", "pip")
def setup(): venv_name = ".venv"
# 1. Verifica preliminare della versione di Python in uso print_step(f"Verifica Ambiente: Python {platform.python_version()} rilevato su {platform.system()}")
# 2. Creazione dell'Ambiente Virtuale (se non presente) if not os.path.exists(venv_name): print_step(f"Inizializzazione ambiente virtuale nella directory '{venv_name}'...") try: # Esecuzione del modulo venv come sottoprocesso subprocess.check_call([sys.executable, "-m", "venv", venv_name]) print("Ambiente virtuale creato con successo.") except subprocess.CalledProcessError: print("[ERRORE FATALE] Impossibile creare il venv. Verificare i permessi o l'installazione di Python.") sys.exit(1) else: print(f"Ambiente '{venv_name}' preesistente rilevato. Procedura di creazione saltata.")
# 3. Aggiornamento pip e installazione dipendenze pip_cmd = get_pip_command(venv_name)
# Verifica integritĂ : controllo esistenza del binario pip if not os.path.exists(pip_cmd): print(f"[ERRORE FATALE] Pip non rilevato nel percorso atteso: {pip_cmd}.") print("Il venv potrebbe essere corrotto o incompleto. Si consiglia di rimuovere la cartella .venv e riprovare.") sys.exit(1)
print_step("Aggiornamento del gestore pacchetti e installazione dipendenze...")
try: # Aggiornamento preventivo di pip per garantire compatibilitĂ con le ultime wheel subprocess.check_call([pip_cmd, "install", "--upgrade", "pip"])
# Installazione dei requisiti, ove presenti if os.path.exists("requirements.txt"): print("File requirements.txt rilevato. Inizio installazione...") subprocess.check_call([pip_cmd, "install", "-r", "requirements.txt"]) print("\n[SUCCESSO] Tutte le dipendenze sono state installate correttamente nell'ambiente virtuale.") else: print("\n[ATTENZIONE] Nessun file 'requirements.txt' rilevato. L'ambiente è attivo ma vuoto.")
except subprocess.CalledProcessError as e: print(f"\n[ERRORE] Fallimento critico durante l'installazione dei pacchetti: {e}") print("Verificare la connettivitĂ di rete o la compatibilitĂ dei pacchetti nel file requirements.") sys.exit(1)
# 4. Istruzioni finali all'utente per l'attivazione manuale print_step("SETUP COMPLETATO") print("L'ambiente è pronto. Per attivarlo manualmente, utilizzare il comando appropriato:") if os.name == "nt": print(f" .\\{venv_name}\\Scripts\\activate") else: print(f" source {venv_name}/bin/activate")
if __name__ == "__main__": setup()13. Compendio degli Strumenti Citati e Riferimenti Documentali
Sezione intitolata â13. Compendio degli Strumenti Citati e Riferimenti DocumentaliâAl fine di offrire un quadro tecnico completo, si riporta di seguito una rassegna sistematica degli strumenti, librerie e framework citati nel presente trattato. Per ciascuna voce è fornita una sintetica descrizione architetturale e il riferimento alla documentazione ufficiale.
13.1 Gestione Pacchetti, Dipendenze e Ambienti
Sezione intitolata â13.1 Gestione Pacchetti, Dipendenze e Ambientiâ-
Poetry: Strumento integrato per la gestione delle dipendenze e il packaging in Python. Utilizza
pyproject.tomlcome standard, gestisce automaticamente i file di lock (poetry.lock) e semplifica la pubblicazione su PyPI. -
PDM: Gestore di pacchetti moderno che supporta la PEP 582 (pacchetti locali senza virtualenv obbligatorio) e offre un resolver estremamente veloce.
-
Pipenv: Strumento che mira a portare il meglio di tutti i mondi del packaging (bundler, composer, npm, cargo, yarn, etc.) nel mondo Python.
13.2 Analisi Statica del Codice (Linters) e Formattazione
Sezione intitolata â13.2 Analisi Statica del Codice (Linters) e Formattazioneâ-
Black: Il formattatore di codice Python âsenza compromessiâ. Riformatta lâintero file in base a regole rigide, garantendo uno stile uniforme (PEP 8 compliant) e riducendo al minimo le discussioni sulle convenzioni di stile durante la code review.
-
Ruff: Un linter e formattatore Python estremamente performante, scritto in Rust. Ă progettato per essere un sostituto âdrop-inâ molto piĂš veloce di Flake8, Black, isort e molti altri strumenti, aggregando oltre 500 regole di analisi.
-
Flake8: Strumento classico che combina
PyFlakes(controllo errori logici),pycodestyle(controllo stile PEP 8) emccabe(controllo complessitĂ ciclomatica).
13.3 Framework Web e Server
Sezione intitolata â13.3 Framework Web e Serverâ-
FastAPI: Framework web moderno e ad alte prestazioni per la costruzione di API con Python 3.8+, basato sulle type hints standard. Offre validazione automatica dei dati (tramite Pydantic) e documentazione interattiva (Swagger UI).
-
Django: Framework web di alto livello âbatteries-includedâ che incoraggia uno sviluppo rapido e un design pulito e pragmatico. Gestisce nativamente ORM, autenticazione e amministrazione.
-
Uvicorn: Unâimplementazione server web ASGI velocissima, basata su
uvloopehttptools. Ă il server standard per eseguire applicazioni FastAPI.
13.4 Interfacce a Riga di Comando (CLI)
Sezione intitolata â13.4 Interfacce a Riga di Comando (CLI)â-
Click: Pacchetto Python per creare interfacce a riga di comando componibili in modo semplice, con il minor codice necessario. Ă altamente configurabile e supporta nesting arbitrario di comandi.
-
Typer: Libreria per costruire CLI basata sulle type hints di Python (costruita sopra Click). Permette di definire comandi semplicemente scrivendo funzioni con argomenti tipizzati.
-
Argparse: Libreria standard di Python per il parsing degli argomenti da riga di comando. Sebbene piĂš verbosa delle alternative moderne, non richiede dipendenze esterne.
13.5 Data Science e Intelligenza Artificiale
Sezione intitolata â13.5 Data Science e Intelligenza Artificialeâ-
LangChain: Framework per lo sviluppo di applicazioni alimentate da modelli linguistici (LLM). Fornisce astrazioni per catene di prompt, agenti, memoria e indici per il recupero di informazioni (RAG).
-
ChromaDB: Database vettoriale open-source progettato per lâIA. Permette di memorizzare embeddings e recuperare documenti semanticamente simili per applicazioni LLM.
-
PyTorch (Torch): Libreria open source di machine learning, utilizzata per applicazioni come la visione artificiale e lâelaborazione del linguaggio naturale.
13.6 UtilitĂ di Sistema e Packaging
Sezione intitolata â13.6 UtilitĂ di Sistema e Packagingâ-
Httpie: Un client HTTP da riga di comando moderno e user-friendly. Offre unâinterfaccia semplice per inviare richieste JSON, output colorato e sintassi intuitiva.
-
PyInstaller: Strumento che âcongelaâ (freezes) applicazioni Python in eseguibili stand-alone, funzionanti su Windows, GNU/Linux, Mac OS X e altri, senza richiedere lâinstallazione dellâinterprete Python sulla macchina target.
-
MkDocs: Generatore di siti statici veloce e semplice, orientato alla documentazione di progetto. La documentazione è scritta in Markdown e configurata tramite un singolo file YAML.