Progetti Python
Il generatore di progetti Python può essere utilizzato per creare una libreria o applicazione Python moderna configurata con le best practice, gestita con UV, un singolo lockfile e ambiente virtuale in un workspace UV, pytest per l’esecuzione dei test, Ruff per l’analisi statica e ty per il controllo dei tipi.
Utilizzo
Sezione intitolata “Utilizzo”Generare un Progetto Python
Sezione intitolata “Generare un Progetto Python”Puoi generare un nuovo progetto Python in due modi:
pnpm nx g @aws/nx-plugin:py#projectyarn nx g @aws/nx-plugin:py#projectnpx nx g @aws/nx-plugin:py#projectbunx nx g @aws/nx-plugin:py#projectPuoi anche eseguire una prova per vedere quali file verrebbero modificati
pnpm nx g @aws/nx-plugin:py#project --dry-runyarn nx g @aws/nx-plugin:py#project --dry-runnpx nx g @aws/nx-plugin:py#project --dry-runbunx nx g @aws/nx-plugin:py#project --dry-run- Installa il Nx Console VSCode Plugin se non l'hai già fatto
- Apri la console Nx in VSCode
- Clicca su
Generate (UI)nella sezione "Common Nx Commands" - Cerca
@aws/nx-plugin - py#project - Compila i parametri richiesti
- Clicca su
Generate
Opzioni
Sezione intitolata “Opzioni”| Parametro | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| name Obbligatorio | string | - | Il nome del progetto Python |
| directory | string | packages | Directory principale dove viene posizionato il progetto. |
| subDirectory | string | - | La sottodirectory in cui viene posizionato il progetto. Per impostazione predefinita corrisponde al nome del progetto. |
| type Obbligatorio | application | library | application | Se il progetto è un'applicazione o una libreria |
| moduleName | string | - | Nome del modulo Python |
| preferInstallDependencies | boolean | true | Se preferire l'installazione delle dipendenze dopo l'esecuzione del generatore. Impostare su false per rimandare l'installazione quando si eseguono più generatori in batch (l'installazione viene comunque eseguita se necessaria affinché i generatori successivi possano calcolare il grafo dei progetti Nx); installare una volta alla fine. |
Output del Generatore
Sezione intitolata “Output del Generatore”Il generatore creerà la seguente struttura di progetto nella directory <directory>/<name>:
Directory<module-name>
- __init__.py Module initialisation
Directorytests
- __init__.py Module initialisation
- conftest.py Test configuration
- test_noop.py Placeholder test
- project.json Project configuration and build targets
- pyproject.toml Packaging configuration file used by UV
- .python-version Contains the project’s Python version
Potresti anche notare i seguenti file creati/aggiornati nella radice del tuo workspace:
- pyproject.toml Workspace level packaging configuration for UV
- .python-version Contains the workspace Python version
- uv.lock Lockfile for Python dependencies
Scrivere Codice Sorgente Python
Sezione intitolata “Scrivere Codice Sorgente Python”Aggiungi il tuo codice sorgente Python nella directory <module-name>.
Importare il Codice della tua Libreria in Altri Progetti
Sezione intitolata “Importare il Codice della tua Libreria in Altri Progetti”Usa il target add per aggiungere una dipendenza a un progetto Python.
Supponiamo di aver creato due progetti python, my_app e my_lib. Questi avranno nomi di progetto completamente qualificati my_scope.my_app e my_scope.my_lib, e per impostazione predefinita avranno ciascuno nomi di modulo my_scope_my_app e my_scope_my_lib.
Affinché my_app dipenda da my_lib, possiamo eseguire il seguente comando:
pnpm nx run my_scope.my_app:add my_scope.my_libyarn nx run my_scope.my_app:add my_scope.my_libnpx nx run my_scope.my_app:add my_scope.my_libbunx nx run my_scope.my_app:add my_scope.my_libPuoi quindi importare il codice della tua libreria:
from my_scope_my_lib.my_module import my_functionSopra, my_scope_my_lib è il nome del modulo per la libreria, my_module corrisponde a un file sorgente Python my_module.py, e my_function è un metodo definito in quel file.
Dipendenze
Sezione intitolata “Dipendenze”Per aggiungere dipendenze al tuo progetto, puoi eseguire il target add nel tuo progetto Python, per esempio:
pnpm nx run my_scope.my_library:add some-pip-packageyarn nx run my_scope.my_library:add some-pip-packagenpx nx run my_scope.my_library:add some-pip-packagebunx nx run my_scope.my_library:add some-pip-packageQuesto aggiungerà la dipendenza al file pyproject.toml del tuo progetto e aggiornerà il uv.lock nella radice.
Codice Runtime
Sezione intitolata “Codice Runtime”Quando usi il tuo progetto Python come codice runtime (ad esempio come handler per una funzione AWS lambda), dovrai creare un bundle del codice sorgente e di tutte le sue dipendenze. Puoi ottenere questo aggiungendo un target come il seguente al tuo file project.json:
{ ... "targets": { ... "bundle": { "cache": true, "executor": "nx:run-commands", "outputs": ["{workspaceRoot}/dist/packages/my_library/bundle"], "options": { "commands": [ "uv export --frozen --no-dev --no-editable --project packages/my_library --package my_scope.my_library -o dist/packages/my_library/bundle/requirements.txt", "uv pip install -n --no-deps --no-installer-metadata --no-compile-bytecode --python-platform x86_64-manylinux_2_28 --python `uv python pin` --target dist/packages/my_library/bundle -r dist/packages/my_library/bundle/requirements.txt" ], "parallel": false }, "dependsOn": ["compile"] }, },}Il tuo progetto Python è configurato con un target build (definito in project.json), che puoi eseguire tramite:
pnpm nx build <project-name>yarn nx build <project-name>npx nx build <project-name>bunx nx build <project-name>Dove <project-name> è il nome completamente qualificato del tuo progetto.
Il target build compilerà, eseguirà il lint, testerà e controllerà i tipi del tuo progetto.
L’output della build può essere trovato nella cartella dist nella radice del tuo workspace, all’interno di una directory per il tuo package e target, per esempio dist/packages/<my-library>/build
Per fare la build di tutti i progetti nel tuo workspace, esegui:
pnpm nx run-many --target buildyarn nx run-many --target buildnpx nx run-many --target buildbunx nx run-many --target buildOppure usa il comando abbreviato:
pnpm buildyarn buildnpm run buildbun buildTesting
Sezione intitolata “Testing”pytest è configurato per testare il tuo progetto.
Scrivere Test
Sezione intitolata “Scrivere Test”I test dovrebbero essere scritti nella directory test all’interno del tuo progetto, in file python con prefisso test_, per esempio:
Directorymy_library
- my_module.py
Directorytests
- test_my_module.py Tests for my_module.py
I test sono metodi che iniziano con test_ e fanno asserzioni per verificare le aspettative, per esempio:
from my_library.my_module import say_hello
def test_say_hello(): assert say_hello("Darth Vader") == "Hello, Darth Vader!"Per maggiori dettagli su come scrivere test, consulta la documentazione di pytest.
Eseguire i Test
Sezione intitolata “Eseguire i Test”I test verranno eseguiti come parte del target build per il tuo progetto, ma puoi anche eseguirli separatamente eseguendo il target test:
pnpm nx test <project-name>yarn nx test <project-name>npx nx test <project-name>bunx nx test <project-name>Puoi eseguire un singolo test o suite di test usando il flag -k, specificando il nome del file di test o del metodo:
pnpm nx test <project-name> -k 'test_say_hello'yarn nx test <project-name> -k 'test_say_hello'npx nx test <project-name> -k 'test_say_hello'bunx nx test <project-name> -k 'test_say_hello'Controllo dei Tipi
Sezione intitolata “Controllo dei Tipi”I progetti Python usano ty per il controllo dei tipi.
Eseguire il Controllo dei Tipi
Sezione intitolata “Eseguire il Controllo dei Tipi”Il controllo dei tipi viene eseguito come parte del target build per il tuo progetto, ma puoi anche eseguirlo separatamente tramite il target typecheck:
pnpm nx run <project-name>:typecheckyarn nx run <project-name>:typechecknpx nx run <project-name>:typecheckbunx nx run <project-name>:typecheckSopprimere Errori di Tipo
Sezione intitolata “Sopprimere Errori di Tipo”Per sopprimere una diagnostica specifica per una singola riga, aggiungi un commento # ty: ignore[<rule>] alla fine della riga, per esempio:
value: int = "not an int" # ty: ignore[invalid-assignment]Per configurare il comportamento del controllo dei tipi nel tuo progetto, aggiungi una sezione [tool.ty] al pyproject.toml del tuo progetto. Consulta il riferimento di configurazione di ty per le opzioni disponibili.
Linting
Sezione intitolata “Linting”I progetti Python usano Ruff per il linting.
Eseguire il Linter
Sezione intitolata “Eseguire il Linter”Per invocare il linter per controllare il tuo progetto, puoi eseguire il target lint.
pnpm nx lint <project-name>yarn nx lint <project-name>npx nx lint <project-name>bunx nx lint <project-name>Correggere Problemi di Lint
Sezione intitolata “Correggere Problemi di Lint”La maggior parte dei problemi di linting o formattazione può essere corretta automaticamente. Puoi dire a Ruff di correggere i problemi di lint eseguendo con l’argomento --configuration=fix.
pnpm nx lint <project-name> --configuration=fixyarn nx lint <project-name> --configuration=fixnpx nx lint <project-name> --configuration=fixbunx nx lint <project-name> --configuration=fixAllo stesso modo, se desideri correggere tutti i problemi di lint in tutti i package nel tuo workspace, puoi eseguire:
pnpm nx run-many --target lint --all --configuration=fixyarn nx run-many --target lint --all --configuration=fixnpx nx run-many --target lint --all --configuration=fixbunx nx run-many --target lint --all --configuration=fixSaltare Problemi di Lint
Sezione intitolata “Saltare Problemi di Lint”Per evitare che i problemi di linting ti rallentino durante lo sviluppo (in particolare se hai problemi non correggibili automaticamente nel tuo progetto), puoi eseguire una build con la configurazione skip-lint:
pnpm nx run-many --target build --configuration=skip-lintyarn nx run-many --target build --configuration=skip-lintnpx nx run-many --target build --configuration=skip-lintbunx nx run-many --target build --configuration=skip-lintQuesto eseguirà comunque Ruff come parte della build, ma il target lint sarà sempre considerato riuscito.